当前位置: 首页 > 面试题库 >

Java-在哪里以及如何使用异常?

苗征
2023-03-14
问题内容

我正在阅读一些有关Java中异常处理的内容,以便能够编写更好的代码。好吧,我承认,我有罪。我使用了太多try-catch
{}块,ex.printStackTrace()在捕获中使用了它,甚至没有使用适当的记录器(实际上是System.outSystem.err被重定向到PrintWriter,因此生成了日志)。但是,经过几个小时的阅读,我发现自己在一个陌生的地方:未知。如果异常被设计为传递有关异常流状态的信息,那么人们如何知道WHERE是使用该信息执行操作的适当级别?

例如,当发生数据库错误时,应该返回空值或错误代码还是引发异常?如果抛出异常,应该在哪里处理该异常?我了解即使您无法对此做任何记录,甚至记录异常也没有用。但是,在GUI应用程序中,这很容易杀死您的GUI(我正在使用SWT,而且我经常看到这种情况),即使是使用该menuShown()方法的情况(ArrayIndexOutOfBounds如果未处理,异常也会关闭该应用程序)。该示例可能永远持续下去,但这是问题的摘要:

  1. 过度使用try-catch()是否会对性能产生负面影响?
  2. 使用特定的异常类型更好吗?如果我错过了可能发生的X种异常之一的捕捉,该怎么办?
    坦白说,在2-3年内,我只听说过Java标准异常的情况就占了10%。是的,有人说如果调用者不知道如何处理抛出的异常,那么他应该没有权利调用抛出方法。那正确吗?

  3. 我已经读过Anders Hejlsberg的这篇文章,说检查异常是不好的。在某些情况下,这是否应表明建议方便吞咽异常?

  4. 一幅图片值一千字;我想一些例子在这里会很有帮助。

我知道这门课程是永恒的​​,但实际上我很期待根据您的建议回顾一个150个班级的中型项目。非常感谢。


问题答案:

那里是例外,因此Task的程序员不必自己解决问题。(1):如果问题对于他来说在任务中不合逻辑。从流中读取字符串的任务不是应该处理磁盘错误吗?但是,如果数据不包含字符串,则应该非常合乎逻辑。

(2):他无法自己处理(信息不足)一项任务,要从文件中读取字符串和未找到文件,可能会要求用户选择另一个文件,但是现在该任务如何才能将文件放在哪个文件夹中?文件的扩展名。在不知道的情况下,任务如何创建GUI来重新询问。

(3):没有逻辑(或可管理)的方式来区分不同的收益。如果任务无法读取文件并返回null。如果文件格式错误,也返回null怎么办?这两个有什么不同?可以使用例外来区别这一点。那就是为什么它被称为Exception
:-D。

(4):有许多相似的任务需要类似的处理和编写,所有任务中都难以维护。编写用于所有访问的句柄代码可能会一团糟,因为您可能需要进行很多重复。

interface DBAccess {
    public Result accessDB();
}

class DBOperation {
    static public void DoOperation(DBAccess pAccess) {
        try { return DBAccess.accessDB(); }
        catch(InvalidDBPasswordException IPE) {
             // Do anything about invalid password
        }
        catch(DBConnectionLostException DBCLE) {
             // Do anything about database connection lost
        }
        // Catch all possible DB problem
    }
}

...

private User[] ShowUserList_and_ReturnUsers() {
    // Find the used.

    // Show user list

    if (Users.count() == 0)
         return null;
    else return Users;

    // No need to handle DB connection problem here
}
private User[] GetUserProfile() {
    // Find the used and return
    // No need to handle DB connection problem here
}
...

/** An onClick event to show user list */ {
    DBOperation.DoOperation(new DBAccess() {
        public Result accessDB() {
            return ShowUserList_and_ReturnUsers();
        }
    });
}
/** An onClick event to show a user profile */ {
    DBOperation.DoOperation(new DBAccess() {
        public Result accessDB() {
            return GetUserProfile();
        }
    });
}
... Many more DB access

(5):编写所有错误检查会使任务复杂或减慢速度。上面的问题应该表明它如何帮助减少并发症。这是不减慢速度的方法。

for(int i = 0; i < Users.length; i++) {
    User aUser = Users[i];
    // Do something with user
}

Replaced with

try {
  for(int i = 0; ; i++) {
      User aUser = Users[i];
      // Do something with user
  }
}
catch(ArrayOutOfBoundException AOBE) {}

如果用户数量很多,替换代码将具有更好的性能。

当发生数据库错误时,应该返回一个空值,错误代码还是引发异常?答:取决于哪种错误。就像您找不到用户一样,这不是错误。但是,如果密码错误或连接断开,则这些错误就是尝试以常规方式处理该程序会使程序复杂化。

(1)。使用过多的try-
catch()对性能有负面影响吗?回答:根据“有效Java”的说法,就我所记得的而言,它的作用非常小(仅在循环中效果不佳)(我现在没有这本书了)。

(2)。使用特定的异常类型更好吗?回答:针对特定用户最好避免解决错误的问题。

如果我错过了可能发生的X种异常类型之一怎么办?坦白说,我在2-3年内只听到并使用了10%的Java标准异常。回答:就像处理错误一样,您也可能会错过它。您只需在发现时将其添加即可。

是的,有人说如果调用方不知道如何处理引发的异常,那么他应该没有权利调用throwing方法。那正确吗?答:不,如果我不知道该怎么做,请重新抛出。

(3)。我读过Anders
Hejlsberg的这篇文章,说检查异常是不好的。在某些情况下,这是否应表明建议方便吞咽异常?回答:我认为他正在谈论“检查异常”作为编译器的功能,以确保应处理某些异常。具有例外的想法。

(4)。一张图片价值1000字。.我想一些例子在这里会很有帮助。答:上面的代码。

我现在逃跑了....对不起… :-p(等一下,亲爱的!)



 类似资料:
  • 问题内容: 我是Angular 4的新手,所以谁能解释在Angular 4中的使用方式和位置? 实际上,我想从父组件覆盖子组件的某些CSS属性。此外,它在IE11上受支持吗? 问题答案: 通常, 可使用组合器将样式强制降低到 。这个选择器有一个别名>>>,现在还有另一个叫做:: ng-deep的别名。 由于 已弃用,建议使用 例如: 和 它将应用于子组件

  • 问题内容: 我在桌面应用程序中使用spring + hibernate。 我正在尝试使用分层实现来构建它,所以我有: GUI层–call- >服务层–call-> DAO层 一个更好地说明我的情况的小例子: 问题是:谁抛出异常并由谁处理? 我认为DAO必须抛出第一个异常,然后服务层将其抛出,最后GUI层处理该异常,这样我才能向用户显示消息,这很好吗?有没有一种方法可以使用spring构建一些Exc

  • 问题内容: 我们应该如何以及在何处使用静态修饰符: 1.领域和 2.方法? 对于例如在类中,字段的方法,如ABS(),ATAN(),COS()等是静态的,即它们可以作为被访问: 但是,为什么这是个好习惯呢? 说,我不是保持静态,而是创建类的对象并访问它,无论如何,我都会得到警告,您正在尝试以非静态方式访问静态方法(如所指出的那样) @duffymo编写,而不是Math类)。 更新1: 因此,实用程

  • 我试图理解一些高级的雄辩命令,在Laravel官方文档中,没有太多关于雄辩或Wherehas方法的内容,也没有关于它如何工作的示例 https://laravel.com/docs/8.x/eloquent-relationships#querying-关系存在 有人能帮我理解一下吗?还有一个简单的例子。

  • 问题内容: 我们可以使用注释的主要领域是什么?该功能是否可以替代基于XML的配置? 问题答案: 注释是元元对象,可用于描述其他元对象。元对象是类,字段和方法。向一个对象询问其元对象(例如)称为自省。内省可以走得更远,我们可以问一个元对象其注释是什么(例如)。内省和注释属于所谓的反射和元编程。 注释需要以一种或另一种方式解释才有用。注释可以在开发时由IDE或编译器解释,也可以在运行时由框架解释。 注

  • 问题内容: 我是数据库编程的新手,我想知道索引的负面影响是什么?据我了解,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作。 考虑以下示例: 对于table (在column上具有索引),操作: 作为索引的结果将更快。 我的问题是:使用索引有什么弊端?如果索引只是给我们带来好处(提高性能),为什么不将它们设置为默认值呢? 问题答案: 好吧,您可能可以填写有关索引的书,但总之,在创建索引