在创建自定义异常时,如果我们想要创建一个已检查的 Exception,我们会扩展Exception类,对于未经检查的异常,我们会扩展RuntimeException类.我的问题是,当JVM全部是Exception类的子类时,JVM如何处理RuntimeException和Exception的子类.
java jvm exception-handling checked-exceptions unchecked-exception
我正在阅读 Java 中已检查与未检查异常以及何时使用每个异常:
这是底线:如果可以合理地期望客户端从异常中恢复,请将其设置为已检查异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。
客户端不能恢复的一个例子是除以零,他们可以恢复的东西是 FileNotFound 异常。不过我还没有看到区别。为什么您可以捕获一个并记录错误,但不能捕获另一个并记录错误?什么使某些东西可以合理恢复?您不能在所有情况下都捕获错误(从而恢复)吗?
我最近一直在阅读很多关于例外的帖子,我有一个问题是应该抓住未经检查的例外.我已经读过,如果您希望应用程序从错误中恢复,请使用已检查的异常.但是,如果您无法处理已检查的异常,则将其包装到另一个已检查的异常中,以便将其传递给另一个层; 例如,你包装一个SqlException,或者你抛出一个未经检查的异常.但是,你应该捕获未经检查的异常吗?未经检查的异常是理想情况下您不检查的编程错误吗?它们应该从您的应用程序中冒出来吗?
使用静态导入的继承静态方法时,我遇到了一些奇怪的行为:
COM /示例/ UTIL/BaseUtil.java:
package com.example.util;
/*default*/ class BaseUtil {
public static final void foo(){ System.out.println("foo"); }
}
Run Code Online (Sandbox Code Playgroud)
COM /示例/ UTIL/Util.java:
package com.example.util;
public final class Util extends BaseUtil{
public static void bar(){ System.out.println("bar"); }
//foo() will be inherited
}
Run Code Online (Sandbox Code Playgroud)
COM /示例/ UtilTest.java
package com.example;
import static com.example.util.Util.bar;
import static com.example.util.Util.foo;
public class UtilTest {
public static void main(String[] args) {
bar();
foo();
}
}
Run Code Online (Sandbox Code Playgroud)
UtilTest在未经检查的异常中运行结果!
线程"main"中的异常java.lang.IllegalAccessError:尝试从类com.example.UtilTest访问类com.example.util.BaseUtil
Run Code Online (Sandbox Code Playgroud)at com.example.UtilTest.main(UtilTest.java:15)
但是,如果我通过Util(没有静态导入)引用方法,一切都按预期工作:
COM /示例/ UtilTest.java
package com.example;
import com.example.util.Util; …Run Code Online (Sandbox Code Playgroud) 我有一个方法调用另一个方法,如下所示:
public void m1() {
m2(10);
}
public void m2(int v) {
if(v < 10)
throw new MyException();
}
public class MyException extends RuntimeException{ }
Run Code Online (Sandbox Code Playgroud)
现在,我想通知将要使用m1()它的客户MyException.如果我这样宣布它是否可以:
public void m1() throws MyException{
m2(10);
}
Run Code Online (Sandbox Code Playgroud)
我不确定它,因为我曾经使用throws带有检查异常的声明.与未经检查的人一起这样做是否常见?
我正在尝试在 Kotlin 中编写一个测试,以确保在特定情况下抛出未经检查的异常。
我正在尝试这样使用org.junit.jupiter.api.Assertions.assertThrows:
assertThrows(MyRuntimeException::class, Executable { myMethodThatThrowsThatException() })
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到一个
类型推断失败编译器错误
因为我的Exceptionin not a CheckedExceptionbut a RuntimeException。有没有什么好方法来测试这种行为而不进行幼稚的尝试捕获?
我最近一直在重新考虑一些Java代码......我发现有很多RuntimeExceptions被抛出(即未经检查的异常).我创建了自己的已检查异常,并用我自己的异常替换了这些RuntimeExceptions的每个实例.然后,这迫使我检查异常.
有了这个,我发现检查异常更好,因为另一个开发人员将确保处理异常...而不是程序只是吃异常而不向用户显示任何内容.
我已经阅读了许多关于未经检查和已检查异常的文章.但是,我仍然觉得我更多地检查了异常,因为它减少了人为错误.
编程有多糟糕,主要是使用检查异常?有没有其他人觉得他们喜欢检查异常比未经检查的异常更多?
任何人都可以告诉我如何以正确的方式创建阵列arraylist?
.\File.java:5: warning: [unchecked] unchecked conversion
ArrayList<myObjectType> myParkingLotArray[] = new ArrayList[3];
^
required: ArrayList<Vehicle>[]
found: ArrayList[]
1 warning
Run Code Online (Sandbox Code Playgroud)
我想要一个存储3个arraylists的arry(或任何其他解决方案).如何将对象添加到arrylists也很高兴知道.
ParentArray
我很高兴任何帮助
解:
public class myClass {
ArrayList<myObjectType>[] myArryName= new ArrayList[3];
public void addLists() {
myArryName[0] = new ArrayList<myObjectType>();
myArryName[1] = new ArrayList<myObjectType>();
myArryName[2] = new ArrayList<myObjectType>();
}
}
Run Code Online (Sandbox Code Playgroud)
警告可以被忽略或抑制.
java arraylist type-conversion unchecked unchecked-exception
我有公共方法add(String)调用私有方法inspectSequence(String)来检查String是否有效.
如果传递String有效,则此方法返回数组,如果它无效则抛出方法IllegalArgumentException
代码是下一个
public void add(String sequence) throws IllegalArgumentException{
inspectSequence(sequence);
}
private int[] inspectSequence(String sequence){
int[] array;
//some actions
if(<some condition>) throw new IllegalArgumentException("description");
return array;
}
Run Code Online (Sandbox Code Playgroud)
所以在情况下,当无效String传递给add方法输出时,下一步是:
java.lang.IllegalArgumentException: description
at inspectSequence
at add
Run Code Online (Sandbox Code Playgroud)
但是我不希望用户知道私有inspectSequence方法,因为这是实现细节,对吧?
那么在那种情况下我能做些什么呢?在这里抛出未经检查的异常是一个好主意吗?
而且是一个好主意,抛出异常中inspectSequence的方法,或者我应该返回null提供时String是无效的,然后检查返回结果add的方法,并根据它扔还是不扔异常?
据我所知,在更改某些对象状态之前,我们使用Guava Preconditions快速失败(这是stackoverflow的一个很好的答案).这很好.但是它会抛出运行时异常,这不是应用程序用户最喜欢的异常(500错误等等......).所以我需要你在设计方面给我一些帮助.
我有一个声明许多方法的接口.每个方法都有必须控制的参数(例如:not null).所以在实现类中我使用如下指令:
Preconditions.checkNotNull(fooObj);
Run Code Online (Sandbox Code Playgroud)
但是,调用此API的程序可能会因运行时异常而崩溃,在本例中为NullPointerException.
那么你如何处理这些未经检查的异常呢?
谢谢.
--------编辑应用层:
数据访问层
API声明交换DTO的方法
使用Guava实现API并检查参数的过程
Web服务取决于流程层
在 Java 中,检查异常和未检查异常都可以显式抛出,即通过throw语句抛出。此外,未经检查的异常如ArithmeticException和OutOfMemoryError可以在没有任何显式throw声明的情况下触发,如下所示:
public static void throwArithmeticException() {
int i = 1;
int j = i / 0;
}
public static void throwOutOfMemoryError() {
List<Object> list = new ArrayList<>();
while(true) {
list.add(new Object());
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,有没有什么方法可以触发检查的异常,例如IOException隐式,即不使用任何throw语句?