java Console 控制台为null问题 Console con = System.console()

问题描述

学习如何从控制台输入中一般都会使用Scanner类,但是读取密码时JavaSE6引入了Console类,测试代码如下:

        Console console =  System.console();
        System.out.println(console);
        System.out.print("请输入你的名字:");
        String personName = console.readLine();
        System.out.print("请输入你的密码:");
        char[] password = console.readPassword();

该段代码在Eclipse的控制台中打印出来的结果是console的值为null.

原因

  如果Java程序要与windows下的cmd或者Linux下的Terminal交互,就可以使用这个Java Console类代劳。Java要与Console进行交互,不总是能得到可用的Java Console类的。一个JVM是否有可用的Console,依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。
  但当使用Eclipse等IDE运行以上代码时Console中将会为null。
  表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。在Eclipse诸如类似的IDE工具中运行Console类。如果没有对Console实例判空操作,结果使用了该实例会抛出java.lang.NullPointerException异常。
  以上解释参考:http://blog.sina.com.cn/s/blog_a4f75d8001018wvf.html

好的,以下是一个简单的愤怒的小鸟游戏程序示例,代码注释中有详细说明: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> // 定义窗口大小 #define WINDOW_WIDTH 60 #define WINDOW_HEIGHT 20 // 定义小鸟和障碍物的数据结构 typedef struct { int x; int y; } Bird; typedef struct { int x; int y; } Obstacle; // 全局变量 Bird bird; // 小鸟 Obstacle obstacle; // 障碍物 int score = 0; // 得分 // 设置控制台窗口大小 void SetWindowSize(int width, int height) { char cmd[30]; sprintf(cmd, "mode con cols=%d lines=%d", width, height); system(cmd); } // 隐藏光标 void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } // 移动光标到指定位置输出字符 void gotoxy(int x, int y, char c) { COORD pos = {x, y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); putchar(c); } // 初始化小鸟和障碍物的位置 void Init() { bird.x = 10; bird.y = WINDOW_HEIGHT / 2; obstacle.x = WINDOW_WIDTH - 1; obstacle.y = rand() % (WINDOW_HEIGHT - 4) + 2; score = 0; } // 显示游戏界面 void Show() { // 清空控制台 system("cls"); // 绘制边框 for (int i = 0; i < WINDOW_HEIGHT; i++) { gotoxy(0, i, '#'); gotoxy(WINDOW_WIDTH - 1, i, '#'); } for (int i = 1; i < WINDOW_WIDTH - 1; i++) { gotoxy(i, 0, '#'); gotoxy(i, WINDOW_HEIGHT - 1, '#'); } // 绘制小鸟和障碍物 gotoxy(bird.x, bird.y, 'O'); gotoxy(obstacle.x, obstacle.y, '|'); gotoxy(obstacle.x, obstacle.y + 1, '|'); gotoxy(obstacle.x, obstacle.y + 2, '|'); // 显示得分 gotoxy(WINDOW_WIDTH / 2 - 2, 0, 'S'); gotoxy(WINDOW_WIDTH / 2, 0, 'C'); gotoxy(WINDOW_WIDTH / 2 + 2, 0, 'O'); gotoxy(WINDOW_WIDTH / 2 - 3, 1, ':'); printf("%d", score); } // 处理用户输入 void Input() { // 检测是否有按键按下 if (_kbhit()) { char c = _getch(); // 按下空格键,小鸟向上飞 if (c == ' ') { bird.y -= 2; } } } // 更新游戏状态 void Update() { // 障碍物向左移动 obstacle.x--; // 如果障碍物移出屏幕,重新随机生成并增加得分 if (obstacle.x < 0) { obstacle.x = WINDOW_WIDTH - 1; obstacle.y = rand() % (WINDOW_HEIGHT - 4) + 2; score++; } // 小鸟下落 bird.y++; // 检测小鸟是否撞到边界或障碍物 if (bird.y <= 0 || bird.y >= WINDOW_HEIGHT - 1 || (bird.x == obstacle.x && (bird.y <= obstacle.y || bird.y >= obstacle.y + 2))) { printf("\a"); // 播放声音 Sleep(1000); // 延迟1秒 Init(); // 重新开始游戏 } } // 主函数 int main() { srand((unsigned)time(NULL)); // 初始化随机数种子 SetWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); // 设置窗口大小 HideCursor(); // 隐藏光标 Init(); // 初始化游戏 while (1) { Show(); // 显示游戏界面 Input(); // 处理用户输入 Update(); // 更新游戏状态 Sleep(100); // 延迟一段时间 } return 0; } ``` 运行程序后,按空格键控制小鸟向上飞,避免撞到边界或障碍物,得分越高,速度越快。如果撞到边界或障碍物,会播放声音并重新开始游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值