我已经看过几次提到这个,我不清楚这是什么意思.你何时以及为何会这样做?
我知道接口有什么作用,但事实上我不清楚这一点让我觉得我错过了正确使用它们.
如果你这样做是这样的:
IInterface classRef = new ObjectWhatever()
Run Code Online (Sandbox Code Playgroud)
你可以使用任何实现的类IInterface吗?你什么时候需要这样做?我唯一能想到的是,如果你有一个方法,你不确定除了实现之外将传递什么对象IInterface.我想不出你需要多久做一次.
另外,你怎么能写一个接受实现接口的对象的方法?那可能吗?
该noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它.根据我到目前为止所读到的内容,最后一分钟的添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题.但是,我仍然无法对一些实际问题提供令人满意的答案,这些问题使我首先要了解更多信息noexcept.
我知道永远不会抛出许多函数的例子,但编译器无法自行确定.noexcept在所有这些情况下我应该附加到函数声明吗?
不得不考虑我是否需要noexcept在每个函数声明之后追加,这将大大降低程序员的工作效率(坦率地说,这将是一个痛苦的屁股).对于哪些情况,我应该更加小心使用noexcept,以及在哪些情况下我可以使用暗示noexcept(false)?
我何时才能真实地期望在使用后观察到性能提升noexcept?特别是,给出一个代码示例,C++编译器在添加之后能够生成更好的机器代码noexcept.
就个人而言,我关心的是noexcept因为编译器提供了更大的自由来安全地应用某些类型的优化.现代编译器是否noexcept以这种方式利用?如果没有,我可以期待他们中的一些人在不久的将来这样做吗?
我已经创建了一个我想在我的应用程序中使用的自定义Exception类:
public class MyException extends Exception {
private static final long serialVersionUID = -2151515147355511072L;
private String message = null;
public MyException() {
super();
}
public MyException(String message) {
super(message);
this.message = message;
}
public MyException(Throwable cause) {
super(cause);
}
@Override
public String toString() {
return message;
}
@Override
public String getMessage() {
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用这个类时,如下所示,它会产生编译时错误.
try {
System.out.println("this");
} catch (MyException e) {
// TODO: handle exception
}
Run Code Online (Sandbox Code Playgroud)
编译时间错误:
Unreachable catch block for MyException . This exception is …Run Code Online (Sandbox Code Playgroud) 我注意到一些复杂库中的方法,包括标准JDK,倾向于throws向上转换异常.起初我在Apache POI的源代码中发现了这种现象,稍后会再次看到它java.io.FileWriter:
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
Run Code Online (Sandbox Code Playgroud)
其中实例化FileOutputStream声明FileNotFoundException此callstack中唯一的已检查异常.然而,IOException声明,这是超级类FileNotFoundException.
那是什么原因呢?还是仅仅依赖于程序员的习惯?