- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
javac是否有可能为以下过程生成无法访问的字节码?
public void ex06(String name) throws Exception {
File config = new File(name);
try (FileOutputStream fos = new FileOutputStream(config);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(
fos , "rw"))) {
bar();
}
}
43 48 86 Class java/lang/Throwable
43 48 95 any
21 135 170 Class java/lang/Throwable
21 135 179 any
Object constraintsLock;
private String[] constraints;
private String constraint;
public void fp01() {
// Add this constraint to the set for our web application
synchronized (constraintsLock) {
String results[] =
new String[constraints.length + 1];
for (int i = 0; i < constraints.length; i++)
results[i] = constraints[i];
results[constraints.length] = constraint;
constraints = results;
}
}
65: astore 4
67: aload_1
68: monitorexit
69: aload 4
Exception table:
from to target type
7 62 65 any
65 69 65 any
最佳答案
TL; DR :已通过JDK-11解决;答案的最后是一个JDK-11的javac
输出示例,用于比较。
Java字节码/JVM的各个位置都暗含了每个throwable都是java.lang.Throwable
实例的事实。即使用于任何处理程序的意图是表示可能超出Throwable
类型层次结构的某种东西,该想法也会失败,因为当今的类文件必须为包含异常处理程序的方法添加一个StackMapTable
,并且StackMapTable
会将任何throw引用为java.lang.Throwable
1的实例。
即使使用旧的类型推断验证程序,处理程序也会隐式重新抛出一个throwable,该处理程序会断言任何throwable都是java.lang.Throwable
的实例,因为这是唯一允许athrow
抛出的对象。
http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.athrow
The objectref must be of type
reference
and must refer to an object that is an instance of classThrowable
or of a subclass ofThrowable
.
java.lang.Throwable
实例(或子类)以外的其他东西可能被抛出或捕获的情况。
javac
的输出。结果清楚地表明,该结构是
javac
在内部如何工作的产物,但不是故意的。
public static void tryWithAuto() throws Exception {
try (AutoCloseable c=dummy()) {
bar();
}
}
private static AutoCloseable dummy() {
return null;
}
private static void bar() {
}
jdk1.8.0_20
编译)
Exception table:
from to target type
17 23 26 Class java/lang/Throwable
6 9 44 Class java/lang/Throwable
6 9 49 any
58 64 67 Class java/lang/Throwable
44 50 49 any
AutoCloseable
(索引0),另一个用于可能的throwable(索引1,已使用
null
初始化)。调用
dummy()
和
bar()
,然后检查
AutoCloseable
中的
null
以查看是否必须将其关闭。
0: invokestatic #2 // Method dummy:()Ljava/lang/AutoCloseable;
3: astore_0
4: aconst_null
5: astore_1
6: invokestatic #3 // Method bar:()V
9: aload_0
10: ifnull 86
AutoCloseable
不是
null
且发生了第一件事,我们会到达此处,检查
null
是否为
null
13: aload_1
14: ifnull 35
AutoCloseable
,该代码由上表中的第一个异常处理程序保护,该异常处理程序将调用
addSuppressed
。由于此时,变量#1为
null
,因此为死代码:
17: aload_0
18: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
23: goto 86
26: astore_2
27: aload_1
28: aload_2
29: invokevirtual #6 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
32: goto 86
goto 86
,它是
return
的分支,因此,如果上面的代码无论如何都不是无效代码,我们可能会开始怀疑为什么要在随后会被忽略的
addSuppressed
上调用
Throwable
。
null
(始终读取)执行的代码。它仅调用
close
并分支到
return
指令,而不捕获任何异常,因此
close()
引发的异常传播到调用者:
35: aload_0
36: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
41: goto 86
try
语句的主体,声明该语句以捕获
Throwable
,读取所有异常。如预期的那样,它将
Throwable
存储到变量#1中,但也将其存储到废弃的变量#2中。然后,它重新抛出
Throwable
。
44: astore_2
45: aload_2
46: astore_1
47: aload_2
48: athrow
Throwable
处理程序的范围相同,因此,正如您所怀疑的那样,该处理程序不执行任何操作。此外,它是第四个异常处理程序的目标,捕获了所有内容并覆盖了上面的异常处理程序,因此我们稍后在一条指令中捕获了#48指令的重新抛出的异常。为了使事情变得更加有趣,异常处理程序涵盖的内容不止上述处理程序;结束于#50(排他性),它甚至涵盖了其本身的第一条指令:
49: astore_3
AutoCloseable
中检查
null
。
50: aload_0
51: ifnull 84
null
。仅当假设的可抛出对象不是
null
时,它才可以是
Throwable
。但是请注意,在这种情况下,整个代码将被验证程序拒绝,因为
StackMapTable
声明了所有变量和操作数堆栈条目,其中包含任何可抛出对象以与
java.lang.Throwable
分配兼容
54: aload_1
55: ifnull 78
58: aload_0
59: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
64: goto 84
addSuppressed
并重新引发主要异常。它引入了另一个局部变量,即使在适当的地方也指示
javac
indeed never uses swap
。
67: astore 4
69: aload_1
70: aload 4
72: invokevirtual #6 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
75: goto 84
java.lang.Throwable
以外的其他情况时才调用,而不是这种情况。代码路径在常规情况下以#84连接。
78: aload_0
79: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
84: aload_3
85: athrow
86: return
Throwable
进行不同处理的想法的产物。此外,一个异常处理程序具有覆盖自身的错误范围,该范围可能与作为
Strange exception table entry produced by Sun's javac的“
suggested in the comments”相关。
close
引发的异常相同,在这种情况下,不得调用
addSuppressed
。
javac
生成的代码与此无关。
0: aconst_null
1: astore_0
2: aconst_null
3: astore_1
4: invokestatic #18 // Method dummy:()Ljava/lang/AutoCloseable;
7: astore_2
8: invokestatic #22 // Method bar:()V
11: aload_2
12: ifnull 59
15: aload_2
16: invokeinterface #25, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
21: goto 59
24: astore_0
25: aload_2
26: ifnull 35
29: aload_2
30: invokeinterface #25, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
35: aload_0
36: athrow
37: astore_1
38: aload_0
39: ifnonnull 47
42: aload_1
43: astore_0
44: goto 57
47: aload_0
48: aload_1
49: if_acmpeq 57
52: aload_0
53: aload_1
54: invokevirtual #30 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
57: aload_0
58: athrow
59: return
Exception table:
from to target type
8 11 24 any
4 37 37 any
javac
将示例编译为
Code:
0: invokestatic #2 // Method dummy:()Ljava/lang/AutoCloseable;
3: astore_0
4: invokestatic #3 // Method bar:()V
7: aload_0
8: ifnull 42
11: aload_0
12: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
17: goto 42
20: astore_1
21: aload_0
22: ifnull 40
25: aload_0
26: invokeinterface #4, 1 // InterfaceMethod java/lang/AutoCloseable.close:()V
31: goto 40
34: astore_2
35: aload_1
36: aload_2
37: invokevirtual #6 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
40: aload_1
41: athrow
42: return
Exception table:
from to target type
4 7 20 Class java/lang/Throwable
25 31 34 Class java/lang/Throwable
addSuppressed
调用指令并以
40
为目标的重新抛出代码的异常处理程序条目,而不是为此情况插入预检查项。然后,它的代码仍将少于替代方法。
关于java - 尝试使用资源引入无法访问的字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25615417/
美好的一天!我试图添加两个字节变量并注意到奇怪的结果。 byte valueA = 255; byte valueB = 1; byte valueC = (byte)(valueA + valueB
嗨,我是 swift 的新手,我正在尝试解码以 [Byte] 形式发回给我的字节数组?当我尝试使用 if let string = String(bytes: d, encoding: .utf8)
我正在使用 ipv4 和 ipv6 存储在 postgres 数据库中。 因为 ipv4 需要 32 位(4 字节)而 ipv6 需要 128(16 字节)位。那么为什么在 postgres 中 CI
我很好奇为什么 Go 不提供 []byte(*string) 方法。从性能的角度来看,[]byte(string) 不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复
我正在尝试为UDP实现Stop-and-Wait ARQ。根据停止等待约定,我在 0 和 1 之间切换 ACK。 正确的 ACK 定义为正确的序列号(0 或 1)AND消息长度。 以下片段是我的代码的
我在下面写了一些代码,目前我正在测试,所以代码中没有数据库查询。 下面的代码显示 if(filesize($filename) != 0) 总是转到 else,即使文件不是 0 字节而是 16 字节那
我使用 Apache poi 3.8 来读取 xls 文件,但出现异常: java.io.IOException: Unable to read entire header; 0 by
字典大小为 72 字节(根据 getsizeof(dict) 在字典上调用 .clear() 之后发生了什么,当新实例化的字典返回 240 字节时? 我知道一个简单的 dict 的起始大小为“8”,并
我目前正在努力创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图将我的工作基于 this research 描述的方法,但我的所有尝试都没有成功。我正在处理的具体输
看看这个简单的程序: #include using namespace std; int main() { unsigned int i=0x3f800000; float* p=(float*)(
我创建了自己的函数,将一个字符串转换为其等效的 BCD 格式的 bytes[]。然后我将此字节发送到 DataOutputStram (使用需要 byte[] 数组的写入方法)。问题出在数字字符串“8
此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”) 周围似乎有很多“小型内存分配器”,但我正在寻找能够处理非常小的分配的一个。我说的
我将数据库脚本从 64 位系统传输到 32 位系统。当我执行脚本时,出现以下错误, Warning! The maximum key length is 900 bytes. The index 'U
想知道 128 字节 ext2 和 256 字节 ext3 文件系统之间的 inode 数据结构差异。 我一直在为 ext2、128 字节 inode 使用此引用:http://www.nongnu.
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
检查其他人是否也遇到类似问题。 shell脚本中的代码: ## Convert file into Unix format first. ## THIS is IMPORTANT. ###
我们有一个测量数据处理应用程序,目前所有数据都保存为 C++ float,这意味着在我们的 x86/Windows 平台上为 32 位/4 字节。 (32 位 Windows 应用程序)。 由于精度成
我读到在 Java 中 long 类型可以提升为 float 和 double ( http://www.javatpoint.com/method-overloading-in-java )。我想问
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
我使用以下代码进行 AES-128 加密来编码一个 16 字节的 block ,但编码值的长度给出了 2 个 32 字节的 block 。我错过了什么吗? plainEnc = AES.enc
我是一名优秀的程序员,十分优秀!