在以前的java版本中,重新抛出异常被视为抛出catch参数的类型.
例如:
public static void test() throws Exception{
DateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
df.parse("x20110731");
new FileReader("file.txt").read();
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中,如果声明异常,则可以更精确地了解抛出的异常final:
//(doesn't compile in Java<7)
public static void test2() throws ParseException, IOException{
DateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
df.parse("x20110731");
new FileReader("file.txt").read();
} catch (final Exception e) {
System.out.println("Caught exception: " + e.getMessage());
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:文档说我需要声明异常final.但如果我不这样做,上面的代码仍然编译和工作.我错过了什么吗?
参考文献:
public interface Proposal {
public static final enum STATUS {
NEW ,
START ,
CONTINUE ,
SENTTOCLIENT
};
}
Run Code Online (Sandbox Code Playgroud)
Java不允许枚举final在接口内部,但默认情况下,接口内的每个数据成员都是public static final.任何人都可以澄清一下吗?
在向量中,std::vector<T>向量拥有分配的存储空间,它构造Ts 并析构Ts。无论 的T类层次结构如何,std::vector<T>都知道它只创建了 a T,因此在.pop_back()调用时它只需要销毁 a T(而不是 的某些派生类T)。采取以下代码:
#include <vector>
struct Bar {
virtual ~Bar() noexcept = default;
};
struct FooOpen : Bar {
int a;
};
struct FooFinal final : Bar {
int a;
};
void popEm(std::vector<FooOpen>& v) {
v.pop_back();
}
void popEm(std::vector<FooFinal>& v) {
v.pop_back();
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/G5ceGe6rq
for只是将向量的大小减少 1(元素)PopEm。FooFinal这是有道理的。但是PopEmforFooOpen调用该类通过扩展而获得的虚拟析构函数Bar。鉴于这FooOpen不是最终的,如果在指针delete …
我想知道在Java中是否有相当于c ++的const.我理解final关键字,但遗憾的是我无法使用它来声明函数返回值final.相反,它始终确保功能不能被覆盖,正确吗?
基本上,我想确保给定的返回类不能被修改并且是只读的.这可能在Java中吗?
我在一些示例BlackBerry Java类中看到了以下一些代码:
try
{
// stuff that will throw an exception
}
catch(final Exception e)
{
// deal with it
}
Run Code Online (Sandbox Code Playgroud)
我认为这final是为了表现.根据标题,因为很少(永远?)任何理由来修改Exception已经抛出的东西,它们应该永远存在final吗?
如果是这样,这不是编译器可以完成的事情吗?或者由编译器完成并final手动添加没有任何影响?
例如,考虑下面的代码捕捉:
public static final int a;
public static final int b;
static {
a = 8; // it's working
Test.b = 10; // compilation error Test.b cannot be assigned.
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能Test.b = 10;在Test类本身的静态块中使用?没有班级名称,它工作正常.
这背后有什么理由吗?
它在本文中说:
让一个类成为最终因为它是不可变的是这样做的一个很好的理由.
我对此感到有点困惑......我理解不变性是线程安全性和简单性的POV中的好东西,但似乎这些问题与可扩展性有些正交.那么,为什么不变性成为最终上课的一个很好的理由呢?
我一直在努力解决Java中的一个问题并且它已经开始找到我了,我真的想不出一个正确的解决方法.
我有一个最终的对象属性,但是动态的.也就是说,我希望值在指定后保持不变,但每个运行时的值可以不同.所以我在类的开头声明了类级变量 - 比如说private final FILE_NAME;.然后,在构造函数中,我为它赋值 - 比方说FILE_NAME = buildFileName();
当我在buildFileName()抛出异常的方法中有代码时,问题就开始了.所以我在构造函数中尝试这样的东西:
try{
FILE_NAME = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个错误 - "空白的最终字段FILE_NAME可能尚未初始化." 这是我开始对Java的严格编译器感到有些恼火的地方.我知道这不会是一个问题,因为如果它到达catch,程序将退出...但编译器不知道,因此不允许此代码.如果我尝试在catch中添加一个虚拟赋值,我会得到 - "可能已经分配了最终字段FILE_NAME." 我显然不能在try-catch之前分配一个默认值,因为我只能分配一次.
有任何想法吗...?
您能否澄清一下,为什么 在课堂上我们将最终关键字作为不可变关键字时需要它.我的意思是,如果我们将所有属性声明为private和final,那么它也是一个不可变类,不是吗?
对不起,如果问题看起来很容易,但我真的很困惑.帮帮我.
Editted:我知道一个声明final的类不能被子类化.但是如果每个属性都是私有的,那么最终会有什么区别呢?
我想设置我的IntelliJ IDEA 14,final以便在现有Java类的所有可能位置(参数,字段等)中自动添加关键字.我找到了一些带有宏和快捷方式的解决方案,但我想设置IntelliJ final在保存文件时添加关键字.有谁知道这个很好的解决方案?也许你可以推荐一些插件或插件的组合?
final ×10
java ×9
exception ×3
c++ ×2
constants ×1
destructor ×1
enums ×1
immutability ×1
intellij-14 ×1
java-7 ×1
oop ×1
performance ×1
static ×1
static-block ×1
vector ×1