java问题,求java代码质量问题

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
import java.lang.reflect.M
public class JustTest {
public static void main(String args[]) {
// 将编译后的Just.class这个Class对象,指向c{Java中一切皆对象}
Class&?& c = Just.
// 获取Just这个类中的自定义的方法,包括private、protected、public、默认{c.getMethods()仅包括public方法}
Method[] m = c.getDeclaredMethods();
for (Method me : m) {
// 获取方法名为“A”的方法名
if (me.getName().equals("A")) {
// 实例化方法,在使用对象之前,先要先加载对应的类
Object obj = c.newInstance();
// 获取方法,参数为(方法名, Class数组), Class数组中存放着参数的类型
Method mm = c.getMethod(me.getName(), new Class[] { java.lang.String.class });
// 执行方法的调用,参数为(类的对象,参数数组)
mm.invoke(obj, new Object[] { "zxg" });
} catch (Exception e) {
// 可能会跑出ClassCastNotFoundation的异常
e.printStackTrace();
class Just {
public void A(String code) {
if (code.equals("zxg")) {
System.out.println("Great!");
如上所示的代码,有几点疑惑的求教:
Class和Object之间的关系怎么理解,看了很多解释,还是不明白。2.步骤中,Object obj = c.newInstance();这个地方为什么要进行实例化。
求解答,谢谢~
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
一个Class对象不是class本身,可以认为它是一个用来访问实际class的界面。
invoke一个实例方法需要一个那个类的实例. invoke一个static方法时就可以传null进去。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我们编写java代码,源文件使用以java为后缀命名,java文件编译后对应的以.class后缀命名;当java虚拟机记载的时class文件,这些文件在虚拟机中必须以某种数据结构的形式存在,来表示对应的class的各种结构及数据,那么这个结构形式就是Class对象,它是对Class的一种描述而Object是Class对象实例化的结果,在JVM中Class类对象只会有1份(同一个ClassLoader加载的,放在JVM的固定内存区域中,GC不会对其进行管理),但是可以有不同的多个实例对象存在
一个类的方法必须依赖一个具体的实例才可以被调用(除了静态方法),因为其要依赖具体实例的数据及状态~~~
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:Java:异常机制、5个关键字和相关代码、自定义异常及注意事项
Java:异常机制、5个关键字和相关代码、自定义异常及注意事项
1. Java使用异常的原因及异常处理机制简介(1)使用异常的原因如果不用异常会产生的缺陷:1)容易混淆。如果约定返回值为-9时表示异常,那么当程序最后的计算结果真是-9呢?2)代码可读性差。将异常处理代码和程序代码混淆在一起将会降低代码的可读性。3)由调用函数来分析异常,这要求程序对库函数有很深的了解。而在Java中提供异常处理机制是提供代码健壮的强有力的方式。使用异常机制它能够降低错误处理代码的复杂度。(2)异常处理机制简介:Java应用程序中,异常处理机制为:抛出异常,捕获异常。抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。2. 异常分类:(1)异常整体分类:Java异常结构中定义有Throwable类。Exception和Error为其子类:1)其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法情况导致的异常;2) 而Error标识Java运行时环境出现的错误,例如:JVM内存耗尽。(2)图形表示如下:(3)Exception异常分类:该异常分类:检查异常和非检查异常1)检查异常:编译验证,对于声明抛出异常的任何方法,编译期强制执行处理或声明规则,不捕获这个异常,编译期就不通过。2)非检查异常:不遵循处理或者声明规则。在产生此类异常是,不一定非要采取任何适当的操作,编译器不检查是否已经解决了这个异常。检查异常举例:非检查异常举例:3. 异常的常用方法:4. 异常捕获:try、catch、finally关键字(1)关键字解释:1) try{…}语句:指定了一段代码,该段代码就是一次捕获并处理例外的范围。2) catch语句:(1)在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句分别对这些异常做相应的处理。如果没有异常发生catch代码被略过不执行。(2)多个try-catch捕获的异常类型由上至下顺序为子类到父类。3)finally语句:(1)为异常处理提供一个统一的出口,使得在控制流转到程序其他部分之前,能够对程序的状态做统一的管理。(2)无论try块中是否抛出异常,finally块都会被执行。(3)可以在finally块中释放资源:文件、数据库连接、网络连接。(2)以上三个关键字应用语法:try{// 程序代码}catch(异常类型1 异常的变量名1){}catch(异常类型2 异常的变量名2){}finally{}(3)try、catch、finally语句块的执行顺序:1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;(4)代码实例:5. 异常抛出:throws/throw关键字如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。(1)关键字具体解释:throw位置是在方法内程序发生异常而无法处理时,会抛出对应的异常对象,除此之外,在某些时刻,您可能会想要自行抛出异常。例如:在处理异常结束后,想将异常抛出,让下一层异常处理块来捕捉。throws位置是在方法签名处声明继承时需要重写继承的子类可以不处理异常,仅抛出父类声明的异常;但是不可以抛出额外的异常(2)throw关键字代码实例:(3)throws关键字代码实例:6. 自定义异常虽然Java类库已经提供了很多可以直接处理异常的类,但有时候为更加精确的捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。但是,自定义异常需要继承Exception。代码实例:7. 异常使用的注意事项:1)当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内。例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。2) Java程序可能是多线程的。每一个线程都是一个独立的执行流,独立的函数调用栈。那么,Java中的异常是线程独立的,线程的问题应该由线程自己来解决,而不要委托到外部,也不会直接影响到其它线程的执行。3)不要在fianlly中使用return。4)不要在finally中抛出异常。5)减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。6)将尽量将所有的return写在函数的最后面,而不是try … catch … finally中。此头条号每天都会分享非常实用的技术文章和笔试题讲解,欢迎大家关注此头条号!
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 成千上万的方式找到一个快乐的方式
作者最新文章各位大虾,有没有代码冗余检查工具呀(FOR JAVA)?求推荐!!
想利用工具检查项目中的冗余代码,请各位大虾,推荐好用工具!!
&冗余代码& 是啥代码? 如何定义&冗余代码&呢?
--- 共有 1 条评论 ---
无用、重复的代码!
我只用过sonar 检查代码重复。
FindBugs &&
Checkstyle&下载插件,links plugin的方式安装到eclipse中
checkstyle&
PMD里有一个CPD(Copy/Paste Detector)工具,可以用来检查重复的代码
http://pmd.sourceforge.net/pmd-5.1.1/cpd-usage.html一、基本概念
&& &动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
二、基本思想与策略
&& &基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
&& &由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
&& &与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
以上都过于理论,还是看看常见的动态规划问题吧!!!
三、常见动态规划问题
&& 1、找零钱问题
&& 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。
给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。
测试样例:
[1,2,4],3,3
解析:设dp[n][m]为使用前n中货币凑成的m的种数,那么就会有两种情况:
&&&&&&&&&&&& 使用第n种货币:dp[n-1][m]+dp[n-1][m-peney[n]]
&&&&&&&&&&&&& 不用第n种货币:dp[n-1][m],为什么不使用第n种货币呢,因为penney[n]&m。
&&&&&&& 这样就可以求出当m&=penney[n]时 dp[n][m] = dp[n-1][m]+dp[n-1][m-peney[n]],否则,dp[n][m] = dp[n-1][m]
代码如下:
&span style=&font-size:18&&import java.util.*;
public class Exchange {
public int countWays(int[] penny, int n, int aim) {
// write code here
if(n==0||penny==null||aim&0){
int[][] pd = new int[n][aim+1];
for(int i=0;i&n;i++){
pd[i][0] = 1;
for(int i=1;penny[0]*i&=i++){
pd[0][penny[0]*i] = 1;
for(int i=1;i&n;i++){
for(int j=0;j&=j++){
if(j&=penny[i]){
pd[i][j] = pd[i-1][j]+pd[i][j-penny[i]];
pd[i][j] = pd[i-1][j];
return pd[n-1][aim];
2、走方格问题
& 有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.
测试样例:
[[1,2,3],[1,1,1]],2,3
解析:设dp[n][m]为走到n*m位置的路径长度,那么显而易见dp[n][m] = min(dp[n-1][m],dp[n][m-1]);
代码如下:
&span style=&font-size:18&&import java.util.*;
public class MinimumPath {
public int getMin(int[][] map, int n, int m) {
// write code here
int[][] dp = new int[n][m];
for(int i=0;i&n;i++){
for(int j=0;j&=i;j++){
dp[i][0]+=map[j][0];
for(int i=0;i&m;i++){
for(int j=0;j&=i;j++){
dp[0][i]+=map[0][j];
for(int i=1;i&n;i++){
for(int j=1;j&m;j++){
dp[i][j] = min(dp[i][j-1]+map[i][j],dp[i-1][j]+map[i][j]);
return dp[n-1][m-1];
public int min(int a,int b){
3、走台阶问题
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。为了防止溢出,请将结果Mod
给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。
测试样例:
解析:这是一个非常经典的为题,设f(n)为上n级台阶的方法,要上到n级台阶的最后一步有两种方式:从n-1级台阶走一步;从n-1级台阶走两步,于是就有了这个公式f(n) = f(n-1)+f(n-2);
代码如下:
&span style=&font-size:18&&import java.util.*;
public class GoUpstairs {
public int countWays(int n) {
// write code here
int f = 1%;
int s = 2%;
int t = 0;
for(int i=3;i&=n;i++){
t = (f+s)%;
4、最长公共序列数
给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A=&1A2C3D4B56”,B=&B1D23CA45B6A”,”123456&或者&12C4B6&都是最长公共子序列。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例:
&1A2C3D4B56&,10,&B1D23CA45B6A&,12
解析:设dp[n][m] ,为A的前n个字符与B的前m个字符的公共序列长度,则当A[n]==B[m]的时候,dp[i][j] = max(dp[i-1][j-1]+1,dp[i-1][j],dp[i][j-1]),否则,dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
代码如下:
&span style=&font-size:18&&import java.util.*;
public class LCS {
public int findLCS(String A, int n, String B, int m) {
// write code here
int[][] dp = new int[n][m];
char[] a = A.toCharArray();
char[] b = B.toCharArray();
for(int i=0;i&n;i++){
if(a[i]==b[0]){
dp[i][0] = 1;
for(int j=i+1;j&n;j++){
dp[j][0] = 1;
for(int i=0;i&m;i++){
if(a[0]==b[i]){
dp[0][i] = 1;
for(int j=i+1;j&m;j++){
dp[0][j] = 1;
for(int i=1;i&n;i++){
for(int j=1;j&m;j++){
if(a[i]==b[j]){
dp[i][j] = max(dp[i-1][j-1]+1,dp[i-1][j],dp[i][j-1]);
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
return dp[n-1][m-1];
public int max(int a,int b,int c){
本文已收录于以下专栏:
相关文章推荐
最近在看JDK源码时,发现JDK的J.U.C包下面的很多类都用到了二叉排序树和红黑树,就想着这一块还是考研的时候看了的,顺便就在理论基础上复习加用Java做个实现。
二叉排序树先来说说这个二叉排序树的...
最小生成树问题(Prim算法)的java实现(贪心算法)
具体问题描述以及C/C++实现参见网址
一、基本概念
    动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  1,1,5; 1,5,1; 5,1,1;
  问有多少种...
数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本数据类型使用,因此,在一些教材中,数组并没有被当做一种数据结构单独拿出来讲解(其实数组就是一段连续的内存,即使在物理内存中不是连续的,在...
动态规划入门
什么是动态规划?
        动态规划(Dynamic Programming,所以我们简称动态规划为DP)是运筹学的一个分支,是求解决策过程(decision process)最优...
二叉查找树
链表是一种插入和删除都比较快的数据结构,缺点是查找比较慢。除非需要频繁的通过下标来随机访问数据,否则在很多使用数组的地方都可以用链表代替
在链表中,每个数据项都包含在“链结点”中,一个链结点是某个类的...
最小生成树问题(Kruskal算法)的java实现(贪心算法)
具体问题描述以及C/C++实现参见网址
http://blog.csdn.net/liufeng_king/article/...
最优装载问题算法的java实现(贪心算法)
具体问题描述以及C/C++实现参见网址
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 孙鑫java 代码有问题 的文章

 

随机推荐