异常

应用程序开发——异常(异常分类、常见异常、异常处理、自定义异常) 异常分类:(Throwable:所有异常和错误的父类)●  Error:JVM无法解决的严重问题(JVM系统内部错误、资源耗尽等。一般不编写针对性的代码进行处理)●  Exception:编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理-----------------------------------------------------------------------... 阅读详情

可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”。笔者在初学java时也是这样认为的。如何在一个多层的j2ee项目中定义相应的异常类?在项目中的每一层如何进行异常处理?异常何时被抛出?异常何时被记录?异常该怎么记录?何时需要把checked Exception转化成unchecked Exception ,何时需要把unChecked Exception转化成checked Exception?异常是否应该呈现到前端页面?如何设计一个异常框架?

本文将就这些问题进行探讨。

1. JAVA异常处理

    在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行。比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0。在vb或delphi开发的应用程序中,出现错误时,我们就弹出一个消息框给用户。 通过方法的返回值我们并不能获得错误的详细信息。可能因为方法由不同的程序员编写,当同一类错误在不同的方法出现时,返回的结果和错误信息并不一致。所以java语言采取了一个统一的异常处理机制。

什么是异常?运行时发生的可被捕获和处理的错误。

    在java语言中,Exception是所有异常的父类。任何异常都扩展于Exception类。Exception就相当于一个错误类型。如果要定义一个新的错误类型就扩展一个新的Exception子类。采用异常的好处还在于可以精确的定位到导致程序出错的源代码位置,并获得详细的错误信息。

    Java异常处理通过五个关键字来实现,try,catch,throw ,throws, finally。具体的异常处理结构由try….catch….finally块来实现。try块存放可能出现异常的java语句,catch用来捕获发生的异常,并对异常进行处理。Finally块用来清除程序中未释放的资源。不管理try块的代码如何返回,finally块都总是被执行。 

一个典型的异常处理代码
 
java 代码
   
public String getPassword(String userId)throws DataAccessException{    
String sql = “select password from userinfo where userid=’”+userId +”’”;    
String password = null;    
Connection con = null;    
Statement s = null;    
ResultSet rs = null;    
try{    
 con = getConnection();//获得数据连接    
 s = con.createStatement();    
 rs = s.executeQuery(sql);    
 while(rs.next()){    
    password = rs.getString(1);    
 }    
 rs.close();    
 s.close();    
      
}    
Catch(SqlException ex){    
 throw new DataAccessException(ex);    
}    
finally{    
 try{    
      if(con != null){    
        con.close();    
      }    
 }    
   Catch(SQLException sqlEx){    
     throw new DataAccessException(“关闭连接失败!”,sqlEx);    
   }    
}    
return password;    
}   

可以看出Java的异常处理机制具有的优势:
    给错误进行了统一的分类,通过扩展Exception类或其子类来实现。从而避免了相同的错误可能在不同的方法中具有不同的错误信息。在不同的方法中出现相同的错误时,只需要throw 相同的异常对象即可。获得更为详细的错误信息。通过异常类,可以给出更为详细,对用户更为有用的错误信息。以便于用户进行跟踪和调试程序。把正确的返回结果与错误信息分离。降低了程序的复杂度。调用者无需要对返回结果进行更多的了解。强制调用者进行异常处理,提高程序的质量。当一个方法声明需要抛出一个异常时,那么调用者必须使用try….catch块对异常进行处理。当然调用者也可以让异常继续往上一层抛出。

2.Checked 异常 还是 unChecked 异常?

    Java异常分为两大类:checked 异常和unChecked 异常。所有继承java.lang.Exception 的异常都属于checked异常。所有继承java.lang.RuntimeException的异常都属于unChecked异常。当一个方法去调用一个可能抛出checked异常的方法,必须通过try…catch块对异常进行捕获进行处理或者重新抛出。我们看看Connection接口的createStatement()方法的声明。public Statement createStatement() throws SQLException;SQLException是checked异常。当调用createStatement方法时,java强制调用者必须对SQLException进行捕获处理。

java 代码
       public String getPassword(String userId){    
       try{    
       ……    
              Statement s = con.createStatement();    
              ……    
       Catch(SQLException sqlEx){    
              ……    
   }    
……    
}    
或者
java 代码
public String getPassword(String userId)throws SQLException{    
   Statement s = con.createStatement();    
}   
(当然,像Connection,Satement这些资源是需要及时关闭的,这里仅是为了说明checked 异常必须强制调用者进行捕获或继续抛出)

    unChecked异常也称为运行时异常,通常RuntimeException都表示用户无法恢复的异常,如无法获得数据库连接,不能打开文件等。虽然用户也可以像处理checked异常一样捕获unChecked异常。但是如果调用者并没有去捕获unChecked异常时,编译器并不会强制你那么做。

比如一个把字符转换为整型数值的代码如下:

java 代码
String str = “123”;    
int value = Integer.parseInt(str);   
 
parseInt的方法签名为:
java 代码
public static int parseInt(String s) throws NumberFormatException

  
    因为java不强制调用者对unChecked异常进行捕获或往上抛出。所以程序员总是喜欢抛出unChecked异常。或者当需要一个新的异常类时,总是习惯的从RuntimeException扩展。当你去调用那些抛出它的方法时,如果没有相应的catch块,编译器也总是让你通过,同时你也根本无需要去了解这个方法倒底会抛出什么异常。看起来这似乎倒是一个很好的办法,但是这样做却是远离了java异常处理的真实意图。并且对调用你这个类的程序员带来误导,因为调用者根本不知道需要在什么情况下处理异常。而checked异常可以明确的告诉调用者,调用这个类需要处理什么异常。如果调用者不去处理,编译器都会提示并且是无法编译通过的。当然怎么处理是由调用者自己去决定的。

    所以Java推荐人们在应用代码中应该使用checked异常。就像我们在上节提到运用异常的好外在于可以强制调用者必须对将会产生的异常进行处理。包括在《java Tutorial》等java官方文档中都把checked异常作为标准用法。

    使用checked异常,应意味着有许多的try…catch在你的代码中。当在编写和处理越来越多的try…catch块之后,许多人终于开始怀疑checked异常倒底是否应该作为标准用法了。

    甚至连大名鼎鼎的《thinking in java》的作者Bruce Eckel也改变了他曾经的想法。Bruce Eckel甚至主张把unChecked异常作为标准用法。并发表文章,以试验checked异常是否应该从java中去掉。Bruce Eckel语:“当少量代码时,checked异常无疑是十分优雅的构思,并有助于避免了许多潜在的错误。但是经验表明,对大量代码来说结果正好相反”

关于checked异常和unChecked异常的详细讨论可以参考
Alan Griffiths?http://www.octopull.demon.co.uk/java/ExceptionalJava.html
Bruce Eckel?http://www.mindView.net/Etc/Disscussions/CheckedExceptions
《java Tutorial》 http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html

使用checked异常会带来许多的问题。checked异常导致了太多的try…catch 代码。 可能有很多checked异常对开发人员来说是无法合理地进行处理的,比如SQLException。而开发人员却不得不去进行try…catch。当开发人员对一个checked异常无法正确的处理时,通常是简单的把异常打印出来或者是干脆什么也不干。特别是对于新手来说,过多的checked异常让他感到无所适从。

java 代码
       try{    
       ……    
              Statement s = con.createStatement();    
              ……    
       Catch(SQLException sqlEx){    
              sqlEx.PrintStackTrace();    
   }    
   或者    
       try{    
       ……    
              Statement s = con.createStatement();    
              ……    
       Catch(SQLException sqlEx){    
          //什么也不干    
}    
checked异常导致了许多难以理解的代码产生。

    当开发人员必须去捕获一个自己无法正确处理的checked异常,通常的是重新封装成一个新的异常后再抛出。这样做并没有为程序带来任何好处。反而使代码更难以理解。就像我们使用JDBC代码那样,需要处理非常多的try…catch.,真正有用的代码被包含在try…catch之内。使得理解这个方法变理困难起来。checked异常导致异常被不断的封装成另一个类异常后再抛出

java 代码
        public void methodA()throws ExceptionA{    
         …..           
          throw new ExceptionA();         
}    
           
public void methodB()throws ExceptionB{    
   try{    
      methodA();    
      ……    
   }catch(ExceptionA ex){    
   throw new ExceptionB(ex);    
   }    
}    
            
        Public void methodC()throws ExceptinC{    
       try{    
         methodB();    
         …    
       }    
       catch(ExceptionB ex){    
          throw new ExceptionC(ex);    
        }    
    }    


我们看到异常就这样一层层无休止的被封装和重新抛出。checked异常导致破坏接口方法。 一个接口上的一个方法已被多个类使用,当为这个方法额外添加一个checked异常时,那么所有调用此方法的代码都需要修改。  可见上面这些问题都是因为调用者无法正确的处理checked异常时而被迫去捕获和处理,被迫封装后再重新抛出。这样十分不方便,并不能带来任何好处。在这种情况下通常使用unChecked异常。

  chekced异常并不是无一是处,checked异常比传统编程的错误返回值要好用得多。通过编译器来确保正确的处理异常比通过返回值判断要好得多。如果一个异常是致命的,不可恢复的。或者调用者去捕获它没有任何益处,使用unChecked异常。
如果一个异常是可以恢复的,可以被调用者正确处理的,使用checked异常。

    在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常。由调用者自己去决定是否捕获unChecked异常

到底什么时候使用checked异常,什么时候使用unChecked异常?并没有一个绝对的标准。但是笔者可以给出一些建议
    1)、当所有调用者必须处理这个异常,可以让调用者进行重试操作;或者该异常相当于该方法的第二个返回值。使用checked异常。
    2)、这个异常仅是少数比较高级的调用者才能处理,一般的调用者不能正确的处理。使用unchecked异常。有能力处理的调用者可以进行高级处理,一般调用者干脆就不处理。
    3)、这个异常是一个非常严重的错误,如数据库连接错误,文件无法打开等。或者这些异常是与外部环境相关的。不是重试可以解决的。使用unchecked异常。因为这种异常一旦出现,调用者根本无法处理。
    4)、如果不能确定时,使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。

 

3.设计一个新的异常类

   在设计一个新的异常类时,首先看看是否真正的需要这个异常类。一般情况下尽量不要去设计新的异常类,而是尽量使用java中已经存在的异常类。

如java 代码IllegalArgumentException, UnsupportedOperationException 
                        
不管是新的异常是chekced异常还是unChecked异常。我们都必须考虑异常的嵌套问题。
java 代码
public void methodA()throws ExceptionA{    
         …..           
          throw new ExceptionA();         
}    
方法methodA声明会抛出ExceptionA.

public void methodB() throws ExceptionB

   methodB声明会抛出ExceptionB,当在methodB方法中调用methodA时,如何将ExceptionA继续往上抛出。
一个办法是把methodB声明会抛出ExceptionA, 但这样已经改变了MethodB的方法签名。一旦改变,则所有调用methodB的方法都要进行改变。

另一个办法是把ExceptionA封装成ExceptionB,然后再抛出。如果我们不把ExceptionA封装在ExceptionB中,就丢失了根异常信息,使得无法跟踪异常的原始出处。

java 代码
public void methodB()throws ExceptionB{    
   try{    
      methodA();    
      ……    
   }catch(ExceptionA ex){    
     throw new ExceptionB(ex);    
   }    
}   
 
   如上面的代码中,ExceptionB嵌套一个ExceptionA.我们暂且把ExceptionA称为“起因异常”,因为ExceptionA导致了ExceptionB的产生。这样才不使异常信息丢失。所以我们在定义一个新的异常类时,必须提供这样一个可以包含嵌套异常的构造函数。并有一个私有成员来保存这个“起因异常”。


java 代码
public Class ExceptionB extends Exception{    
private Throwable cause;    
     
public ExceptionB(String msg, Throwable ex){    
 super(msg);    
 this.cause = ex;    
}    
     
public ExceptionB(String msg){    
 super(msg);    
}    
     
public ExceptionB(Throwable ex){    
 this.cause = ex;    
}    
}    


当然,我们在调用printStackTrace方法时,需要把所有的“起因异常”的信息也同时打印出来。所以我们需要覆写printStackTrace方法来显示全部的异常栈跟踪。包括嵌套异常的栈跟踪。

java 代码
public void printStackTrace(PrintStrean ps){    
if(cause == null){    
 super.printStackTrace(ps);    
}else{    
 ps.println(this);    
 cause.printStackTrace(ps);    
}    
}    
一个完整的支持嵌套的checked异常类源码如下。我们在这里暂且把它叫做NestedException
 
java 代码
public NestedException extends Exception{    
private Throwable cause;    
public NestedException (String msg){    
 super(msg);    
}    
     
public NestedException(String msg, Throwable ex){    
 super(msg);    
 This.cause = ex;    
}    
     
public Throwable getCause(){    
 return (this.cause == null ? this :this.cause);    
}    
     
public getMessage(){    
 String message = super.getMessage();    
 Throwable cause = getCause();    
   if(cause != null){    
     message = message + “;nested Exception is ” + cause;    
   }    
 return message;    
}    
public void printStackTrace(PrintStream ps){    
 if(getCause == null){    
    super.printStackTrace(ps);    
        
 }else{    
 ps.println(this);    
 getCause().printStackTrace(ps);    
 }    
}    
     
public void printStackTrace(PrintWrite pw){    
 if(getCause() == null){    
    super.printStackTrace(pw);    
 }    
 else{    
    pw.println(this);    
    getCause().printStackTrace(pw);    
 }    
}    
public void printStackTrace(){    
 printStackTrace(System.error);    
}    
}    
     
同样要设计一个unChecked异常类也与上面一样。只是需要继承RuntimeException。
 
4. 如何记录异常
    作为一个大型的应用系统都需要用日志文件来记录系统的运行,以便于跟踪和记录系统的运行情况。系统发生的异常理所当然的需要记录在日志系统中。


java 代码
public String getPassword(String userId)throws NoSuchUserException{    
UserInfo user = userDao.queryUserById(userId);    
If(user == null){    
 Logger.info(“找不到该用户信息,userId=”+userId);    
 throw new NoSuchUserException(“找不到该用户信息,userId=”+userId);    
}    
else{    
 return user.getPassword();    
}    
}    
     
public void sendUserPassword(String userId) throws Exception {    
UserInfo user = null;    
try{    
  user = getPassword(userId);    
   //……..    
 sendMail();    
 //    
}catch(NoSuchUserException ex)(    
   logger.error(“找不到该用户信息:”+userId+ex);    
   throw new Exception(ex);    
}    


我们注意到,一个错误被记录了两次.在错误的起源位置我们仅是以info级别进行记录。而在sendUserPassword方法中,我们还把整个异常信息都记录了。笔者曾看到很多项目是这样记录异常的,不管三七二一,只有遇到异常就把整个异常全部记录下。如果一个异常被不断的封装抛出多次,那么就被记录了多次。那么异常倒底该在什么地方被记录?

异常应该在最初产生的位置记录!

如果必须捕获一个无法正确处理的异常,仅仅是把它封装成另外一种异常往上抛出。不必再次把已经被记录过的异常再次记录。
如果捕获到一个异常,但是这个异常是可以处理的。则无需要记录异常

java 代码
public Date getDate(String str){    
    Date applyDate = null;    
    SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);    
    try{    
        applyDate = format.parse(applyDateStr);    
    }  catch(ParseException ex){    
         //乎略,当格式错误时,返回null    
    }    
    return applyDate;    
}    
捕获到一个未记录过的异常或外部系统异常时,应该记录异常的详细信息

java 代码
try{    
       ……    
      String sql=”select * from userinfo”;    
      Statement s = con.createStatement();    
       ……    

Catch(SQLException sqlEx){    
       Logger.error(“sql执行错误”+sql+sqlEx);    
}    
   究竟在哪里记录异常信息,及怎么记录异常信息,可能是见仁见智的问题了。甚至有些系统让异常类一记录异常。当产生一个新异常对象时,异常信息就被自动记录。

java 代码
  public class BusinessException extends Exception {    
      private void logTrace() {    
          StringBuffer buffer=new StringBuffer();    
          buffer.append("Business Error in Class: ");    
          buffer.append(getClassName());    
          buffer.append(",method: ");    
          buffer.append(getMethodName());    
          buffer.append(",messsage: ");    
          buffer.append(this.getMessage());    
          logger.error(buffer.toString());                 
}    
public BusinessException(String s) {    
         super(s);    
Trace();    
}    


    这似乎看起来是十分美妙的,其实必然导致了异常被重复记录。同时违反了“类的职责分配原则”,是一种不好的设计。记录异常不属于异常类的行为,记录异常应该由专门的日志系统去做。并且异常的记录信息是不断变化的。我们在记录异常时应该给出更丰富些的信息。以利于我们能够根据异常信息找到问题的根源,以解决问题。

   虽然我们对记录异常讨论了很多,过多的强调这些反而使开发人员更为疑惑,一种好的方式是为系统提供一个异常处理框架。由框架来决定是否记录异常和怎么记录异常。而不是由普通程序员去决定。但是了解些还是有益的。
 

5.J2EE项目中的异常处理

    目前,J2ee项目一般都会从逻辑上分为多层。比较经典的分为三层:表示层,业务层,集成层(包括数据库访问和外部系统的访问)。J2ee项目有着其复杂性,J2ee项目的异常处理需要特别注意几个问题。

    在分布式应用时,我们会遇到许多checked异常。所有RMI调用(包括EJB远程接口调用)都会抛出java.rmi.RemoteException;同时RemoteException是checked异常,当我们在业务系统中进行远程调用时,我们都需要编写大量的代码来处理这些checked异常。而一旦发生RemoteException这些checked异常对系统是非常严重的,几乎没有任何进行重试的可能。也就是说,当出现RemoteException这些可怕的checked异常,我们没有任何重试的必要性,却必须要编写大量的try…catch代码去处理它。一般我们都是在最底层进行RMI调用,只要有一个RMI调用,所有上层的接口都会要求抛出RemoteException异常。因为我们处理RemoteException的方式就是把它继续往上抛。这样一来就破坏了我们业务接口。RemoteException这些J2EE系统级的异常严重的影响了我们的业务接口。我们对系统进行分层的目的就是减少系统之间的依赖,每一层的技术改变不至于影响到其它层。

java 代码
//    
public class UserSoaImpl implements UserSoa{    
   public UserInfo getUserInfo(String userId)throws RemoteException{    
      //……    
远程方法调用.    
      //……    
   }    
}    
public interface UserManager{    
   public UserInfo getUserInfo(Stirng userId)throws RemoteException;    
}    


同样JDBC访问都会抛出SQLException的checked异常。

   为了避免系统级的checked异常对业务系统的深度侵入,我们可以为业务方法定义一个业务系统自己的异常。针对像SQLException,RemoteException这些非常严重的异常,我们可以新定义一个unChecked的异常,然后把SQLException,RemoteException封装成unChecked异常后抛出。

如果这个系统级的异常是要交由上一级调用者处理的,可以新定义一个checked的业务异常,然后把系统级的异常封存装成业务级的异常后再抛出。

一般地,我们需要定义一个unChecked异常,让集成层接口的所有方法都声明抛出这unChecked异常。

java 代码
public DataAccessException extends RuntimeException{    
 ……    
}    
public interface UserDao{    
     public String getPassword(String userId)throws DataAccessException;    
}    
     
public class UserDaoImpl implements UserDAO{    
     public String getPassword(String userId)throws DataAccessException{    
     String sql = “select password from userInfo where userId= ‘”+userId+”’”;    
     try{    
             …    
            //JDBC调用    
            s.executeQuery(sql);    
      }catch(SQLException ex){    
            throw new DataAccessException(“数据库查询失败”+sql,ex);    
     }    
}

    
定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出Checked异常.
 
java 代码
public class BusinessException extends Exception{    
 …..    
}    
     
public interface UserManager{    
      public Userinfo copyUserInfo(Userinfo user)throws BusinessException{    
            Userinfo newUser = null;    
             try{    
                    newUser = (Userinfo)user.clone();    
             }catch(CloneNotSupportedException ex){    
                  throw new BusinessException(“不支持clone方法:”+Userinfo.class.getName(),ex);    
            }    
      }    
}   


J2ee表示层应该是一个很薄的层,主要的功能为:获得页面请求,把页面的参数组装成POJO对象,调用相应的业务方法,然后进行页面转发,把相应的业务数据呈现给页面。表示层需要注意一个问题,表示层需要对数据的合法性进行校验,比如某些录入域不能为空,字符长度校验等。J2ee从页面所有传给后台的参数都是字符型的,如果要求输入数值或日期类型的参数时,必须把字符值转换为相应的数值或日期值。如果表示层代码校验参数不合法时,应该返回到原始页面,让用户重新录入数据,并提示相关的错误信息。

通常把一个从页面传来的参数转换为数值,我们可以看到这样的代码

java 代码
ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{    
   String ageStr = request.getParameter(“age”);    
   int age = Integer.parse(ageStr);    
   String birthDayStr = request.getParameter(“birthDay”);    
  SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);    
   Date birthDay = format.parse(birthDayStr);    
     
}    
上面的代码应该经常见到,但是当用户从页面录入一个不能转换为整型的字符或一个错误的日期值时,

Integer.parse()方法被抛出一个NumberFormatException的unChecked异常。但是这个异常绝对不是一个致命的异常,一般当用户在页面的录入域录入的值不合法时,我们应该提示用户进行重新录入。但是一旦抛出unchecked异常,就没有重试的机会了。像这样的代码造成大量的异常信息显示到页面。使我们的系统看起来非常的脆弱。

同样,SimpleDateFormat.parse()方法也会抛出ParseException的unChecked异常。

这种情况我们都应该捕获这些unChecked异常,并给提示用户重新录入。


java 代码
ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{    
     String ageStr = request.getParameter(“age”);    
     String birthDayStr = request.getParameter(“birthDay”);    
     int age = 0;    
     Date birthDay = null;    
    try{    
         age=Integer.parse(ageStr);    
    }catch(NumberFormatException ex){    
        error.reject(“age”,”不是合法的整数值”);    
    }    
    
 try{    
      SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);    
      birthDay = format.parse(birthDayStr);    
 }catch(ParseException ex){    
     error.reject(“birthDay”,”不是合法的日期,请录入’MM/dd/yyy’格式的日期”);    
 }       
}   

     在表示层一定要弄清楚调用方法的是否会抛出unChecked异常,什么情况下会抛出这些异常,并作出正确的处理。
在表示层调用系统的业务方法,一般情况下是无需要捕获异常的。如果调用的业务方法抛出的异常相当于第二个返回值时,在这种情况下是需要捕获

异常检测中的三种异常:点异常、上下文异常、集合异常 文章目录直观解释点异常上下文异常集合异常Reference 直观解释 异常检测问题遇到的异常可以分为三类,分别是点异常(Point Anomalies)、上下文异常(Contextual Anomalies)和集合异常(Collective Anomalies)。 一图胜千言,下面分别用一张图说明这些异常。 点异常 示意图如下,其中o1o_1o1​、o2o_2o2​属于点异常 上下文异常 示意图如下,其中t2t_2t2​处属于上下文异常 集合异常 示意图如下,箭头所指的红框区域属于集合异常 Refer 阅读详情

相关推荐

Unity3D Lua与C#的相互调用与性能剖析详解

在游戏开发中,经常会遇到Lua与C#之间的相互调用的情况。本文将详细介绍Unity3D中Lua与C#的相互调用的方式,并对其性能进行剖析。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!一、Lua与C#的相互调用方式Lua调用C#在Unity3D中,可以通过Lua调用C#的方式来实现Lua与C#的相互调用。具体步骤如下:(1)首先需要在Unity3D项目中导入Lua的相关库,例如tolua或者xlua。

weixin_49669470的博客 1215

J2EE项目异常处理

J2EE项目异常处理                        为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”。笔者在初学java时也是这样认为的。如何在一个多层的j2ee项目中定义相应的异常类?在项目中的每一层如何进行异常处理?异常何时被抛出?异常何时被记录?异常该怎么记录?何时需要把checked ...

klyuan 490

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 538

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdRedisUtils' defined in class path resource [spring/spring-config-redis.xml]: Cannot resolve referen...

乔治大哥的博客 3726

服务器被攻击植入挖矿病毒,CPU占用高问题排查处理(.systemd-service.sh)

客户服务器遭攻击,部署的应用服务经常性被停止,服务器CPU占用居高不下,top查看如下: 可以看到第一个bash任务,占用cpu近400%,非正常的应用程序和脚本任务,多半是被植入了木马信息。 查看该进程的符号连接,发现已经是被删除的状态 /usr/bin/-bash (deleted),无法查看其启动程序的信息 查看定时任务:cat /etc/crontab,发现都是正常的应用程序定时脚本 又用 crontab -l 查看了一下,发现了异常定时任务如下,同top里的异常任务一致...

gottst0113的博客 2121

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2322

Java异常 Exception类及其子类

Java异常 Exception类及其子类

runwuwushengxiyu的博客 886

LAMMPS+Phonopy计算声子色散曲线

机器学习训练完势函数之后,需要对加以验证。对于晶体而言,色散曲线是其衡量计算是否准确的最重要标准,当然,还有能量,比热,RDF等性质。

qq_68842798的博客 3462

12306站点码表

var station_names ='@bjb|北京北|VAP|beijingbei|bjb|0@bjd|北京东|BOP|beijingdong|bjd|1@bji|北京|BJP|beijing|bj|2@bjn|北京南|VNP|beijingnan|bjn|3@bjx|北京西|BXP|beijingxi|bjx|4@gzn|广州南|IZQ|guangzhounan|gzn|5@cqb|重庆北|...

javakeffer的专栏 12万+

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 532

【推荐100个unity插件】基于节点的程序化无限地图生成器 —— MapMagic 2

MapMagic 2是一款基于节点的程序化地形生成工具,可快速创建无限地图。主要功能包括:通过图形化节点编辑器构建地形逻辑;支持四个核心模块(对象、样条线、生物群落和笔刷);提供完整的操作指南,包括创建资产、使用编辑器窗口、节点操作等。工具具有直观的UI界面,支持节点连接、参数调整、图层管理等功能,并能实时生成地形。适合游戏开发者快速构建高质量的可玩地形环境。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3123

java项目中的异常处理_Java EE项目中的异常处理总结(一篇不得不看的文章)

为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”。笔者在初学java时也是这样认为的。如何在一个多层的j2ee项目中定义相应的异常类?在项目中的每一层如何进行异常处理?异常何时被抛出?异常何时被记录?异常该怎么记录?何时需要把checked Exception转化成unchecked Exception ,何...

weixin_39668527的博客 239

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2840

Java中的异常总结详解(异常类型、声明异常、抛出异常、捕获异常)

Java 异常解析前言 前言

YING—country的博客 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

异常-异常场景的测试

在功能测试中,测试人员主要关注的是功能是否能符合预期的正常运行,比如测试一个下单的流程,关注下单、购买、发货流程是否能一气呵成。但仅仅关注正常流程是不够的,在实际的使用场景下,会出现各种非正常的情况: 一些具体的需求需要通过业务特性挖掘: 如果是秒杀这样的高并发业务场景,那么需要考虑降级、并发。 依赖消息通知的业务,需要关注NSQ推送和消费相关的异常。 使用缓存的业务,需要关注缓存访问失败的情况,以及异常情况下数据一致性。 如果业务流程很重要必须要保证成功,那么需要关注是否有降级、容错、重试

Queen_xzx的专栏 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java异常 — — 异常的处理

二、异常的处理 Java异常处理的五个关键字: try、catch、finally、throw、throws 2.1、抛出异常throw 在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不台法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。 抛出异常后: ① 创建一个异常对象。封装一些提示

mocoll的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

浅谈Java异常及其编译时异常和运行时异常的区别

异常是程序编码和运行时经常发生的事件,了解异常有助于我们提高代码质量,增强系统的健壮性,这里总结一下载Java编程中,编译时异常和运行异常时的区别,并列举几种常见的异常,以供参考学习。

Feify博客 1万+

抛出异常和捕获异常的区别

抛出异常:如果程序中出现了异常,没有办法将具体的异常打印出来,不做任何处理 捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的Log 如果异常出现的话,会立刻终止程序,所以我们得处理异常: 1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。 2. 在方法中使用try-catch的语句块来处理异常。 ...

qq_29090169的博客 1万+

【JAVA |异常】异常总结详解(异常类型、声明异常、抛出异常、捕获异常)

在 Java 中,异常处理是一种重要的编程概念,用于处理程序执行过程中可能出现的错误或异常情况。异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

YKX0000的博客 2871

【Java】❤️认识异常、异常的基本使用、认识异常(异常详解)❤️

目录一、 异常的背景异常体系:**防御式编程:**异常的好处二、异常的基本用法**基本语法****关于异常的处理方式**抛出异常 一、 异常的背景 初识异常 我们曾经的代码中已经接触了一些 “异常” 了. 例如 除以 0 public static void main(String[] args) { System.out.println(10 / 0); } 算术异常: 数组下标越界 数组越界 int[] arr = {1, 2, 3}; System.out.println(

意愿三七 4万+

ioexception属于什么异常_Java异常

异常介绍程序运行时,发生不被期望的事情,它阻止了程序 按照程序员的预期正常执行,这就是异常。异常发生时,是任其自生自灭,立即退出终止,还是输出错误给用户?用函数返回值作为执行状态?。Java提供了更加优秀的解决办法:异常处理机制。异常处理机制能让程序在异常发生时,按照代码的预先设定异常处理逻辑,针对性的异常处理,让程序尽最大可能的恢复正常并继续执行,且保持代码的清晰。Java中的异常可以是函数中的...

weixin_39861624的博客 8638

oracle异常、异常捕捉以及异常处理

异常以及处理异常1、概念2、预定义异常1、两数相除,分母为0,捕捉并抛出异常2、值转换异常3、根据姓名查找员工的职位,可能会出现的异常有:没有个这员工,或者有两个或更多的人叫同样的名字。3、非预定义异常4、自定义异常5、课堂练习: 1、概念 异常是指PL/SQL程序在执行时出现的错误 在PL/SQL中的一个警告或错误的情形都被称为异常。提示:编译错误(主要指语法错误)不包含在内。 异常处理通常写在执行体的最下面,在所有执行语句之后以exception关键字开始异常处理 语法: Exception when

hey,欢迎浏览我的博客,希望能给你提供帮助。 8300

JAVA基础:异常与异常对象,抛出异常,自定义异常,异常处理,受检与非受检异常

我们可以自定义异常,来描述出现的问题自定义异常类 , 继承异常相关的父类(Throwable,Exception , Error)一般异常的名字就体现了错误的情况,可以在配合注释进一步说明/**当年龄小于0或大于150时,抛出这样的异常*/2.通过有参构造方法,为异常提供更为详细的描述信息(可选)super(msg);3.使用throw 抛出异常。

weixin_53755148的博客 1286

【java】认识异常,理解异常,掌握异常

文章目录 1️⃣异常的背景 1.认识异常 2.避免异常的两种方式 2️⃣异常的基本用法 1.基本语法 2.多个 catch 块 3.使用共同父类 Exception 捕获异常 4.关于异常的错误输出 5.关于异常的调用链 6.关于 finally 代码块 7.使用 try 回收资源 8.一组关键字:throw 和 throws 9.异常处理流程总结 3️⃣异常体系结构 受查异常 4️⃣自定义异常类

Welcome to my blog. 1071

什么是异常?如何处理异常?

到底神马是异常?如何处理异常? 异常的概念 异常的体系结构 Java 异常的处理机制 异常处理的基本语法 异常链 自定义异常 总结 异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。 异常发生的原因有很多,通常包含以

Anonymous_GL的博客 5154

声明异常,抛出异常,异常的简单总结

声明异常声明异常自定义异常若是有多种类型的异常匹配,则异常匹配的顺序总结: 如果在一个方法体中抛出了异常,如何通知调用者? 声明异常 方法有两种: 方法1:调用者处理异常:通常在方法后面加throws Exception 方法2:调用者继续声明异常(下一个接收的人在处理) public static void main(String[] args) throws Exception { //...

qq_41969892的博客 3999
上一篇: CAP原则(CAP定理)、BASE理论
下一篇: 【面试题】java类加载机制探索
wang___wang___
博客等级 码龄11年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值