Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理类的运行时异常_Java_Android_Exception Handling - Fatal编程技术网

Java 处理类的运行时异常

Java 处理类的运行时异常,java,android,exception-handling,Java,Android,Exception Handling,我有一个类扩展了应用程序,它有很多方法,比如: public User getUser(String name); public List<User> getFriends(User user); public List<Game> getGames(User user); 是否有一种方法可以包装每个调用,这样我就不必在我的应用程序的每个方法上添加try-catch了?如果不使用Android上可用的任何第三方库,就没有简单的方法包装类的方法。如果可以将应用程序功能提取

我有一个类扩展了
应用程序
,它有很多方法,比如:

public User getUser(String name);
public List<User> getFriends(User user);
public List<Game> getGames(User user);

是否有一种方法可以包装每个调用,这样我就不必在我的
应用程序的每个方法上添加try-catch了?

如果不使用Android上可用的任何第三方库,就没有简单的方法包装类的方法。如果可以将应用程序功能提取到接口中,则可以使用来实现接口-代理实现是调用实际实现方法的单个方法,并缓存和处理异常

如果将代码分解成单独的类和接口是一种可行的方法,我可以提供更多细节

编辑:以下是详细信息:

您当前使用的是实现这些方法的
myService
。如果还没有,请创建一个接口UserService,声明服务方法:

public interface UserService {
  User getUser(String name);
  List<User> getFriends(User user);
  List<Game> getGames(User user);
}
为了避免重复,异常处理被实现为

然后在应用程序类中将其用作代理:

InvocationHandler handler = new HandleNoInternet(this, myService);
UserService appUserService = (UserService)Proxy.newProxyInstance(
   getClass().getClassLoader(), new Class[] { UserService.class }, handler);

然后,您可以使用
appUserService
,而无需担心捕捉到NoInternetException。

这与您的问题没有直接关系,但使用ConnectionManager来检测是否存在internet连接,而不是捕捉到NoInternetException()@Daniel Lew:是的,我知道,但如果我这样做了,我需要修改我应用程序中的每个视图,以便在互联网关闭时禁用链接。从长远来看,禁用链接可能对你的应用程序更有利。只是一个想法。:)使用代理来实现干涸有意义吗?@Macarse-非常有意义。在常规java中,代理是许多AOP框架的主干,方面是避免重复的一种方法。在这种情况下,方面是一致的异常处理。使用代理,只需定义一次所需的行为,并将其应用于所有需要一致异常处理的方法。除了代码生成工具之外,我看不到其他替代工具。酷。你能告诉我如何将它应用到我的例子中吗?太好了。谢谢我不得不改变一些想法,我会编辑你的答案。
class MyService implements UserService {
     // .. existing methods unchanged 
     // interface implemented since methods were already present
}
class HandleNoInternet implements InvocationHandler {
   private final Object delegate;   // set fields from constructor args
   private final Application app;

   public HandleNoInternet(Application app, Object delegate) {
      this.app = app; 
      this.delegate = delegate;
   }
   public Object invoke(Object proxy, Method method, Object[] args) {
       try {
           // invoke the method on the delegate and handle the exception
           method.invoke(delegate, args);
       } catch (Exception ex) {
           if ( ex.getCause() instanceof NoInternetException ) {
             NoInternetToast.show(app);
           } else {
             throw new RuntimeException(ex);
           }
       }
   }
}
InvocationHandler handler = new HandleNoInternet(this, myService);
UserService appUserService = (UserService)Proxy.newProxyInstance(
   getClass().getClassLoader(), new Class[] { UserService.class }, handler);