小谈Java的初始化问题

小谈Intel SGX Intel SGX简介 背景 为什么要Intel SGX? Intel SGX的目标就是为了解决目前日益受关注的“远程计算的安全问题”。 以云环境为例子,云租户会将自己的产品部署在云平台中,但是云平台现在普遍认为是一个不可信的地方,因为可能会有云平台管理者、同一云主机其他租户的恶意攻击,也可能云平台本身存在漏洞,使得黑客轻易的攻击并拿到Ring0权限(就好比我租了房东的一间卧室,我害怕房东、其他租户、陌生人对我房间东张西望,甚至搞破坏。)。这种情况下,云租户就开始担心了。 与此同时,Intel SGX 阅读详情

优快云乱码了。重新编辑。

同学发给我一个代码如下:


package hello;
public class hello {
	public static void main(String[] args) {
		int i, j;
		int sum;
		for (i = 1; i <= 1000; i++) {
			for (j = 1, sum = 0; j <= i / 2; j++) {
				if (i % j == 0)
					sum += j;
			}
                if (sum == i)
			System.out.println(sum);
}
         }
}


此代码无法通过编译,提示的错误如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The local variable sum may not have been initialized
The local variable sum may not have been initialized
at hello.hello.main(hello.java:12)

通过对sum的追踪发现sum与int sum中的sum是一个变量。通过C++测试发现C++编译通过并得到结果。

修改代码如下:


package hello;
public class hello {
	public static void main(String[] args) {
		int i, j;
		int sum = 0;//*修改
		for (i = 1; i <= 1000; i++) {
			for (j = 1, sum = 0; j <= i / 2; j++) {
				if (i % j == 0)
					sum += j;
			}
			if (sum == i)
				System.out.println(sum);
		}
	}
}


可以得到正确的答案。

思考如下:Java是一门比较注重安全的语言,for循环能否保证一定可以进入呢?

思考以下代码:


package hello;
public class hello {
	public static void main(String[] args) {
		int i, j;
		int sum = 0;
		for (i = 1; i <= -1000; i++) {
			for (j = 1, sum = 0; j <= i / 2; j++) {
				if (i % j == 0)
					sum += j;
			}
			if (sum == i)
				System.out.println(sum);
		}
	}
}


上面的代码并没有报错。可见就算for循环不符合数理,仍然是可以通过编译的。

那么从安全的角度看来,Java就不应该让一个全局变量的初始化发生在for循环中。当然这是我们的猜测而已。

再思考以下代码:


package hello;
public class hello {
	public static void main(String[] args) {
		int sum;
		while(true){
			sum = 1000;
			break;
		}
		System.out.println(sum);
	}
}


以上代码可以通过编译。

而:


package hello;
public class hello {
	public static void main(String[] args) {
		int sum;
		boolean i = true;
		while(i){
			sum = 1000;
			break;
		}
		System.out.println(sum);
	}
}


则无法通过编译。以上两则代码的区别仅仅是在于判断条件所在的位置。在while(true)中,这个循环是绝对可以进入的,但是在while(i)中呢?假设存在多线程的情况,那么这个循环将不一定可以进入。

所以多少可以侧证我们之前的结论:Java为了注重安全性,不会允许初始化的工作放在不确定的循环中。

---------------------------切割线-----------------------------

那Java不是会自动初始化的嘛?

思考以下代码:


package hello;
public class hello {
	private static int age;
	public static void main(String[] args) {
		System.out.println(age);
	}
}


在代码中,age必须是static的,因为调用它的方法(main)是static的,这是题外话了。

上面的代码输出结果是0,表示Java会自动初始化这个成员变量。

那么局部变量呢?


package hello;
public class hello {
//	private static int age;
	public static void main(String[] args) {
		int age;
		System.out.println(age);
	}
}

以上代码得到下面的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The local variable age may not have been initialized
        at hello.hello.main(hello.java:6)


所以局部变量Java是不会初始化的。

本文结束。


小谈设计模式(17)—状态模式 对设计模式中状态模式进行详细解析 阅读详情

相关推荐

小谈设计模式(10)—原型模式

对设计模式中的原型模式进行了讲解分析

AI+全栈,AI+应用,实操落地,前沿技术 1567

Java错误解决方法合集

错误和解决方法都是亲自验证过的,解决方法可以用!不断更新中。 文章目录一、错误提示:Unexpected exception encountered during query.二、错误提示:MYSQL插入中文显示乱码。三、错误提示:windows中没有mysql服务。四、错误提示:Client does not support authentication五、错误提示:Unknown init...

spark2010的博客 7519

利用VBA宏实现LightTools仿真数据自动化导出至Excel

本文详细介绍了如何利用VBA宏实现LightTools仿真数据自动化导出至Excel的完整流程。通过调用LTAPI接口,工程师可以自动执行仿真、抓取照度与光强等数值数据、捕获并粘贴仿真图像,从而将重复性工作自动化,显著提升光学设计工作的效率和准确性。

weixin_28314575的博客 502

在学习java程序初始化时碰到的问题及解决

因为:给类变量赋值的引用出现以下情况会报错:1.引用是类变量的初始化或是在类的静态初始化程序(静态代码块)里。局部变量的作用域是声明了这个变量到block的最后。a的作用域是整个testStatic,所以声明前也能用,和在函数定义前调用函数是一个道理。起因:代码里a=2前不加int,声明在后面,不懂为啥。参见8.3.3章节的文档。

m0_54174553的博客 509

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

Labelme安装教程(附Anaconda安装教程)

本文详细介绍了如何安装Anaconda和Labelme,还提供了常见问题的解决建议。

HanYan_ing的博客 1万+

java 未初始化_Java 代码中的可能未初始化变量问题

出现的错误:import java.util.Scanner;public class tickets {public static void main(String[] args) {Scanner stdin=new Scanner(System.in);System.out.println("Please enter the for family or not ( Y or N ): ");...

weixin_39652810的博客 670

Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。 第一部分 Geant4的基本概念 HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用,几何形状和材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。 Gea

M_M-铭的博客 2万+

“The local variable XXX may not have been initialized”

“The local variable XXX may not have been initialized” 翻译一下就是:局部变量XXX可能尚未初始化 在文件中的操作是: double d = 0.00; String str = "100"; try{ d = Double.parseDouble(str); }catch(Exception e){ } /*

饭糕的博客 4万+

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程

📢本篇将介绍SARADC的源码分析和工作流程。

内核笔记 3231

小谈Java中类加载以及对象初始化的过程

探讨Java中类加载到完成一个对象创建的过程 Java作为面向对象的一门语言,在程序中最重要的也是最基础的就是通过类创建对象,在本文中我简单聊一聊对于这个过程我个人的理解。有不足之处还请多多指正。 一个Java类中有什么? 那么当我们创建一个对象时执行了哪些操作呢? 类加载以及对象创建及其初始化 类加载:发生在类第一次被虚拟机调用,类会被虚拟机加载一次,一般来说,也只被加载一...

Viaxiz 881

A133在Android13上适配百兆以太网

NOTE] 【技术支持问题】问题背景/平台。

mangofu的博客 412

小谈Java构造器

java构造器的原理相似于c++中的构造函数,是一个特殊的成员函数,是用于创建类实例的一个重要方法。如果一个类要进行对一系列属性的初始化,那么构造函数可以根据函数需要进行编写完成所有变量的初始化,不必一一去初始化。 对其做简单的总结,它的基本特点是: 构造方法的方法名必须与类名相同。构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。构造方法的主要作用是完成对象

Runing and flying 1522

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

小谈Java中的静态块与非静态块

原文地址:点击打开链接 java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些...

aobi6343的博客 114

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 静态块 非静态块_小谈Java中的静态块与非静态块

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下:static {静态语句代码块}{非静态语句代码块}异同点相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋 值。不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构...

weixin_42099815的博客 175

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

小谈单例模式 | 单例模式的八种写法?

看了这篇文章,你能和面试官畅谈单例模式一、前言二、单例模式最通俗的解释来一个简单的例子三、实现单例模式的8种写法1.饿汉式(静态常量)(可用)2.饿汉式(静态代码块)(可用)3.懒汉式(线程不安全)(不可用)4.懒汉式(线程安全)(不推荐)5.懒汉式(线程不安全)(不可用)6.懒汉式(双重检查)(推荐面试使用)7.懒汉(静态内部类方式)(可用)8.枚举 推荐在项目中使用四、常见面试问题五、关于几种...

qq_35764460的博客 1690

小谈ResultSet用法

结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.   结果集读取数据的方法主要是getXXX(),他的参数可以使整型表示第几列(是从1开始的),还可以是列名.返回的是对应的XXX类型的值. 如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果X...

abo38416的博客 136

小谈队列

小谈队列   虽然数组是存储和访问速度最快的数据结构,但是却受创建时其长度、存储的类型就固定限制这一特性所限制。为此我们引入动态存储数据的数据结构——队列。说到队列,现实生活中还真有不少:食堂打菜的学生、超市等待结账的客户、影院排队购票的观影者,现实生活中总是存在排队现象。当我们把队列搬到计算机、搬到JAVA程序中,我们需要找寻队列的特性。 每次排队,人们总会自觉从后面加入队列,当然也有那...

u014442623的博客 166
上一篇: 有用的知识技能书签
下一篇: IBM技术论坛:单元测试利器 JUnit 4
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值