1. 在java中的方法后面加个throws抛出异常有什么作用?

  throws就是放在类与方法后面,然后你要调用这个类与方法时,直接将类或方法抛出异常.
  throw就是单个语句抛出异常  

  把异常抛给调用它的地方,如果你不加的话,main里的try catch是拿不到 这个异常的。也就是说,被调用函数出错了。上一级也不知道怎么回事。。。
同时,你加上throw exception。调用的地方就必须try catch,不然编译都不过。。这样代码就更健壮了。不会跟c语言一样,一出错,没处理。系统可能就崩溃了。默认为把exception往上一级抛,所以如果你没加这一句throw exception,main方法里可以不用try catch;如果加了,main方法必须try catch,或者再在后面throw exception。如果你的方法是别人要调用的,你又明知道可能会出错异常的代码。比如算数。输入输出流。当然,你要是简单到可以肯定不会出异常,就可以不做处理。你就应该把代码内部先try catch。然后再throw 一个自定义异常。这样别人就知道出在哪里。

 1 //BusinessException是自定义异常类。
 2 Public static void show() throws BusinessException{
 3   try{
 4         Scanner input = new Scanner(System.in);
 5         System.out.println("请输入被除数:");
 6         int num  = input.nextInt();
 7         System.out.println("请输入除数");
 8         int num1 = input.nextInt();
 9         System.out.println(String.format("%d / %d =     %d",num,num1,num/num1) );
10   }catch(Exception e){
11       throw new BusinessException("显示异常",e);
12   }
13 }

  其它相关参考Java中main函数后的throwsException。回避异常:有异常被抛出了,就要做处理,所以java中有try-catch。可是有时候一个方法中产生了异常,但是不知道该怎么处理它,那么就放着不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样,这种情况称为回避异常。但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常。

2. java中e.printStackTrace()不要使用,请使用logger记录

  转自javascript:void(0)。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。printStackTrace()是异常类的一个方法。与它重载的方法还有printStackTrace(PrintStream s) 和printStackTrace(PrintWriter s)。它调用了printStackTrace(PrintStream s)方法。err是System类当中的一个静态PrintStream类型字段,所以它能传递进去。e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中

1 //在Throwable类中printStackTrace()内部是这样执行的:
2 public void printStackTrace() 
3 {
4         printStackTrace(System.err);
5 } 

  e.printStackTrace() 会导致锁死?这仅仅是打印啊,怎么可能?!原因是要打印字符串输出到控制台上,那你字符串常量池所在的内存块要有空间啊。然而,因为e.printStackTrace() 语句要产生的字符串记录的是堆栈信息,太长太多,内存被填满了!注意 上面代码语句:4208行!

3. sql中Statement与PreparedStatement的区别。及在使用中注意事项:

  1).Statement用于执行静态sql语句,在执行时,必须指定一个事先准备好的sql语句,也就是说sql语句是静态的。 

  2).PrepareStatement是预编译的sql语句对象,sql语句被预编译并保存在对象中。 被封装的sql语句代表某一类操作,语句中可以包含动态参数“?”,在执行时可以为“?”动态设置参数值。 

  3).使用PrepareStatement对象执行sqll时,sql被数据库进行解析和编译,然后被放到命令缓冲区,每当执行同一个PrepareStatement对象时,它就会被解析一次,但不会被再次编译。 在缓冲区可以发现预编译的命令,并且可以重用。所以PrepareStatement可以减少编译次数提高数据库性能。 

  4).Statement可以被sql注入,而PrepareStatement不能被sql注入

4. 查询子表出现错误   

  在执行DB 的SQL语句查询时候发现代码运行有异常,经过比较后发现在执行语句时候有一些参数需要特别注意。看看createStatement这个API,他有个好几个参数。详细用法可参考ResultSet用法集锦可输出sql的PrepareStatement封装

1 //查询子表出现错误
2 com.ibm.db2.jcc.b.SqlException: This method should only be called on ResultSet objects that are scrollable(type TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_INSENSITIVE)

  这是ResultSet  的游标类型设置有问题,

1 //按以下方式创建Statement,可以设定ResultSet可以滚动和更新
2 Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

没有坚守就没有事业,没有执着就没有未来!