java 类没有返回类型,返回类型的Java方法编译时没有return语句
问题
问题1:
为什么以下代码在没有return语句的情况下编译?
public int a() {
while(true);
}
注意:如果我在一段时间后添加返回,那么我得到aUnreachable Code Error。
问题2:
另一方面,为什么以下代码编译,
public int a() {
while(0 == 0);
}
即使以下没有。
public int a(int b) {
while(b == b);
}
#1 热门回答(272 赞)
问题1:为什么以下代码在没有return语句的情况下编译? public int a()
{
而(真);
}
如果声明方法具有返回类型(第8.4.5节),则如果方法体可以正常完成(第14.1节),则会发生编译时错误。换句话说,具有返回类型的方法必须仅使用提供值返回的return语句返回;该方法不允许"掉落其身体的末端"。有关方法体中返回语句的准确规则,请参见§14.17。方法可能具有返回类型但不包含return语句。这是一个例子:class DizzyDean {
int pitch(){throw new RuntimeException("90 mph?!"); }
}
由于编译器知道循环永远不会终止(当然,true总是为真),它知道函数不能"正常返回"(掉落它的主体的末尾),因此可以没有return。
问题2:另一方面,为什么以下代码编译,public int a()
{
而(0 == 0);
}
即使以下没有。 public int a(int b)
{
而(b == b);
}
在0 == 0中,编译器知道循环永远不会终止(即0 == 0将始终为真)。但it并没有知道那个b == b。
为什么不?
某些表达式具有可在编译时确定的值。这些是常量表达式(§15.28)。
在你的b == b示例中,因为涉及一个变量,它不是一个常量表达式,并且未指定在编译时确定.我们可以看到它在这种情况下总是会成立(尽管ifb是adouble,如QBrutepointed out ,我们很容易被Double.NaN(isnot==自己)欺骗,但是JLS只指定在编译时确定常量表达式,它不允许编译器尝试计算非常量表达式。 bayou.ioraised a good point为什么不:如果你开始沿着试图在编译时确定涉及变量的表达式的道路,你在哪里停止?b == b很明显(呃,对于非NaN值),但是什么关于a + b == b + a? Or(a + b) * 2 == a * 2 + b * 2?在常量上绘制线条是有道理的。
因此,由于它没有"确定"表达式,编译器不知道循环将永远不会终止,因此它认为该方法可以正常返回 - 这是不允许的,因为它需要使用2826101052。所以它抱怨缺乏areturn。
#2 热门回答(32 赞)
将方法返回类型视为返回指定类型的值的承诺,但作为promisenotto返回不是指定类型的值,可能会很有趣。因此,如果你从未退货,那么你并没有违背承诺,因此以下任何一项都是合法的:
永远循环:X foo(){
for(;;);
}
永远递归:X foo(){
return foo();
}
抛出异常:X foo(){
抛出新的错误();
}
(我发现递归是一个有趣的思考:编译器认为该方法将返回typeX的值(无论是什么),但事实并非如此,因为没有代码存在任何想法如何创建或采购anX。)
#3 热门回答(8 赞)
查看字节代码,如果返回的内容与定义不匹配,则会收到编译错误。
示例:
for(;;)将显示字节码:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
注意缺少任何返回字节码
这不会返回,因此不会返回错误的类型。
为了比较,一种方法如下:
public String getBar() {
return bar;
}
将返回以下字节码:
public java.lang.String getBar();
Code:
0: aload_0
1: getfield #2; //Field bar:Ljava/lang/String;
4: areturn
注意"areturn",意思是"返回参考"
现在,如果我们执行以下操作:
public String getBar() {
return 1;
}
将返回以下字节码:
public String getBar();
Code:
0: iconst_1
1: ireturn
现在我们可以看到定义中的类型与ireturn的返回类型不匹配,这意味着返回int。
所以它真正归结为如果该方法具有返回路径,则该路径必须与返回类型匹配。但是在字节码中有些实例根本没有生成返回路径,因此没有违反规则。
java 类没有返回类型,返回类型的Java方法编译时没有return语句相关推荐
- java类的定义的实例_《Java基础知识》Java类的定义及其实例化
类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public classDog { String name;intage;void ...
- java 类复制构造方法_java面向对象入门(3)-java构造方法
Java构造函数是特殊的方法(没有返回类型),使您可以在应用程序内部的其他类使用对象之前完全初始化对象状态.Java中的构造方法是使用new关键字调用的. 下面让我们更深入地了解构造函数. 1.什么是 ...
- java类验证和装载顺序_深度分析Java的ClassLoader机制(源码级别)
原文地址:https://dwz.cn/AztGFkO7 作者:Hollis Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文 ...
- java类加入到spring容器_普通java类加入spring容器的四种方式
今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...
- java 类 属性数量_跟我学java编程—Java类的属性与成员变量
在定义类时,经常需要抽象出它的属性,并定义在类的主体中.下面就来介绍与属性相关的内容. 常量属性 在类中定义的属性有常量属性和成员属性之分.常量属性用final关键字修饰,常量只能赋值一次,在程序中不 ...
- [200127] Java类初始化与实例初始化 - Thinking in Java学习日志
文章目录 类初始化 类初始化顺序 类初始化实例 小结 实例初始化 实例初始化顺序 实例初始化实例 小结 后记 类初始化 类初始化顺序 类初始化实例 父类定义 package com.phycanva. ...
- java类功能说明注释添加,IDEA添加Java类注释模版的方法
本文介绍了idea添加java类注释模版的方法,分享给大家,具体如下: idea版本:intellij idea 2017.2.5 x64 eclipse能在类上方输入/**,回车添加类注释模版,但i ...
- jax ws ri 生成java类_JAX-WS(一)之使用wsgen从Java创建简单的WebService
概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...
- java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
我无法解决看似微不足道的问题.我的问题可能是缺乏对Kotlin语言的经验(和理解).不过,我将需要帮助. 我做了一个自定义类,其中包含一个自定义函数.看起来很简单,但是当我尝试使用此功能时,我一直收到 ...
最新文章
- 进程、线程、堆、栈的理解和区别!
- 用户识别率提升 25 倍 | 看神策数据如何利用 ID-Mapping 激活全域营销
- [云炬创业学笔记]第二章决定成为创业者测试2
- NET Core入门笔记
- php refcount,php的函数的形参refcount为何要加2
- 02_入门程序(非注解方式,了解)
- 事务对性能影响_不是事务的事务!(分布式事务系列-完结篇)
- 【H.264/AVC视频编解码技术详解】七、 熵编码算法(1):基础知识
- 向量化计算cell_Matlab向量化编程在二级劝退学科中的一个应用例子
- Nginx的安装、启动、停止命令
- 【Linux】进程通信、同步、IO复用代码
- 充电书库-study
- MySQL的相关问题
- 实战中,利用10日均线捕捉主升浪,必须满足这四个条件!
- Snort的TILE64移植
- K3 CLOUD组织间结算取价指引
- springboot内嵌tomcat如何优雅开启http端口
- Navicat提示access violation at address in module'navicate.exe'
- 转:爬虫入门 手写一个Java爬虫
- Python之 函数笔记