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);