我知道在c++中变量有块作用域,例如,下面的代码在C++中工作
void foo(){
int a = 0;
for(int i = 0; i < 10; ++i){
int a = 1; //re-define a here.
}
}
但是这个代码片段在java中不起作用,它报告“重复的局部变量a",这是否意味着java变量没有块作用域?
我对这段代码有问题:
if (false)
int i = 9;
...
我意识到它是无用的,因为if语句的作用域将只包含声明,并且在声明之后我将无法访问它,因为它超出了作用域,而且编译器可能足够聪明地避免这种情况。如果我包括大括号,一切都会正常工作,这可能是因为编译器知道我可以在声明之后编写更多的代码,并在代码中使用变量。我只是想知道,这是否真的是我得到编译时错误的原因,还是有更深层次的解释?我得到了:
A.java:4: '.class' expected
int i = 4;
^
A.java:4: not a statement
我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
(C++):
if (true) {
int x = 1;
}
std::cout << x << std::endl;
此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
(VBA):
If True Then
Dim x As
在Java中,do-while循环体和循环条件不属于同一个作用域。所以下面的代码不会被编译:
do {
boolean b = false;
} while (b); // b cannot be resolved to a variable
但是这段代码对我来说是有意义的。
此外,如果主体和条件在同一个作用域中,我也找不到任何缺陷;由于主体总是会被执行,而Java没有Goto,我不知道如何跳过最外层的do-while主体作用域中的变量声明。即使有可能,编译器也总是可以检测到这种可能性,然后产生编译时错误。
这种行为有什么原因(除了让do-while循环保持与while相同的格式之外)
我正在尝试根据INT的值来更改JTextField的背景色。为什么下面的比较代码不起作用?
if (braincomplete < 0 && > 10){
//set the colour red
}
if (braincomplete > 10 && <18){
//set the colour yellow
}
if (braincomplete >18){
//set the colour green
}
我认为&&对Java来说是正确的吗?
我正在学习变量作用域,在查看一些线程时,我看到了以下Python代码:
a = 1
b = 2
c = 3
def foo():
print a
print b
print c
c = c + 1
def main():
foo()
main()
它会打印出1 2和UnBoundLocalError: local variable 'c' referenced before assignment。当我把它翻译成Java时
public class Test1 {
static int a = 1;
static int b =
我正在学习如何将Java库与Ruby代码集成,并提出以下问题。
我有一个用Java实现的命令模式,如下所示:
public interface Command {
public String execute(String param);
}
public class CommandRunner {
public String run(Command cmd, String param) {
return cmd.execute(param)+" [this is added by run method]";
}
}
当我将它导入到JRuby程序时,我可以
在使用Java语言时,我注意到我可以在公共类中创建一个新的Properties实例;但是,当我尝试将属性加载到properties实例中时,它不起作用,并且只在public void bla()中起作用。我已经创建了一个带有注释的示例代码来说明我的困惑: import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class Foo {
Properties myProps = new Properties(); // Can create the
Java编译器如何处理下面的转换块?'b‘变量的作用域是什么?
请注意,'b‘变量仅在switch语句的第一个分支中声明。尝试在第二个分支中声明它也会导致“重复局部变量”编译错误。
int a = 3;
switch( a ) {
case 0:
int b = 1;
System.out.println("case 0: b = " + b);
break;
case 1:
// the following line does not compile: b may
我试图理解Java的范围。在Perl中,我可以执行以下操作:
my $x = 1;
{
my $x = 2;
say $x; # prints 2
}
say $x; # prints 1
换句话说,由于我在作用域中声明了变量$x和my,该作用域中的$x变量是该作用域的本地变量(即,与全局$x变量不同)。现在,在Java中,我试图做一些类似的事情,但是我得到了错误
变量rawURL已在方法run()中定义
下面是代码:
// Global rawURL
URI rawURl;
try {
rawURL = new URI("http://www.google
我正在尝试使用Java小程序获取真正的客户端IP地址。我希望最终在PHP脚本中使用它,以帮助实现安全性和身份验证。PHP方法都不起作用,因为各种HTTP标头不可用,很容易被欺骗。
因此,我采用了和中建议的方法
但是,我无法编译我的简单Applet。我是Java的新手,所以我有点困惑。
代码为:
import java.net.*;
import java.io.*;
public class SimpleSocketClient
{
public SimpleSocketClient()
{
try
{
Socket s
我一直在尝试用Java声明一个数组,就像tutorial所说的那样,但是收到了一个错误。下面是我的代码:
public class ArrayExample {
private static final int SIZE = 15;
/* this works */
int[] arrayOfInt = new int[SIZE];
/* but this doesn't work, says "cannot find symbol" */
int[] arrOfInt;
arrOfInt = new int[SIZ
我想在处理过程中创建一个简单的方法队列,并且我试图用Java的本机反射来实现它。为什么getDeclaredMethod()在这个示例中不起作用?有办法让它起作用吗?不管我尝试过的变体如何,它总是返回NoSuchMethodException.
import java.lang.reflect.Method;
void draw() {
Testclass t = new Testclass();
Class myClass = t.getClass();
println("Class: " + myClass);
// This doesn't w
我试图了解在Java中发生开关的情况下,这是如何有效的。
switch(someValue){
case abc: int i=0
break;
case def: int i=0 // error because i declared above is still accessible in this case.`
如果我们说变量在Java中有块作用域,那么在def的情况下,"i“变量不应该是不可访问的吗?还是这种情况没有被视为一个障碍呢?很多人以前一定遇到过这个问题。
为什么这不违反编程的任何基本概念?
我们今天无意中发现了代码中的一个问题,无法回答Clojure的问题:
是否严格或懒惰地计算不纯代码(或调用Java代码)?
似乎副作用+懒惰序列会导致奇怪的行为。
下面是我们所知道的导致这个问题的原因:
Clojure有惰性序列:
user=> (take 5 (range)) ; (range) returns an infinite list
(0 1 2 3 4)
而Clojure有副作用和不纯的功能:
user=> (def value (println 5))
5 ; 5 is printed out to s
以下Java代码无法编译。
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
为什么?在没有事先声明的情况下,不能有通向程序将1赋值给b的代码路径。
我突然想到b的变量作用域可能只限于第一个if语句,但我就不明白为什么了。如果我真的不想为了提高性能而不必要地声明b呢?我不喜欢在声明后留下未使用的变量。
(您可能会争辩说,我可以在第二个if语句中简单地声明b,在这种情况下,可以想象它可能在其他地方的循环中。)
下面的类有一个名为Entry的内部类。这段代码不能在Java8中编译,因为编译器假设双花括号初始化器中引用的Entry是Map.Entry类型,而不是Scope.Entry类型。这段代码可以在JDK的早期版本(至少是6和7)中编译,但是在JDK8中被破坏了。我的问题是“为什么?”这个类中没有导入Map.Entry,因此编译器没有理由假设该值是Map.Entry类型。是否为匿名类引入了隐式作用域或其他内容?
错误:
scope/Scope.java:23: error: incompatible types: scope.Scope.Entry cannot be converted to ja