IntelliJ Idea在从bash调用java时并不总是按预期运行我的代码

IntelliJ Idea在从bash调用java时并不总是按预期运行我的代码,java,intellij-idea,Java,Intellij Idea,我正在学习建立一个游戏 然而,当我从IntelliJ Idea运行代码时,有时它不会呈现,有时会呈现。 这不是渲染。 这是渲染 然后我试着用一个终端来运行它,它每次都能正常运行。 为什么? 这是我的配置 java在这里 ` package com.tutorial.main; 导入java.awt.*; 导入java.awt.image.BufferStrategy; 导入java.util.Random; 公共类游戏扩展画布实现可运行{ 私有静态最终长serialVersionUID=156

我正在学习建立一个游戏 然而,当我从IntelliJ Idea运行代码时,有时它不会呈现,有时会呈现。 这不是渲染。 这是渲染

然后我试着用一个终端来运行它,它每次都能正常运行。 为什么? 这是我的配置

java在这里 `

package com.tutorial.main;
导入java.awt.*;
导入java.awt.image.BufferStrategy;
导入java.util.Random;
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=1569537827497786082L;
公共静态最终整数宽度=640,高度=宽度/12*9;
私有线程;
私有布尔运行=false;
私人经办人;
私有随机r;
公共游戏(){
handler=新的handler();
新窗口(宽度、高度,“让我们构建一个游戏吧!”,此窗口);
r=新随机数();
对于(int i=0;i<50;i++){
handler.addObject(新播放器(r.nextInt(宽度)、r.nextInt(高度)、ID.Player));
}
//addObject(新玩家(200200,ID.Player));
}
公共同步的void start(){
线程=新线程(此);
thread.start();
运行=真;
}
公共同步无效停止(){
试一试{
thread.join();
运行=错误;
}捕获(例外e){
e、 printStackTrace();
}
}
公开募捐{
long lastTime=System.nanoTime();
双amountOfTicks=60.0;
双ns=1000000000/个;
双增量=0;
长定时器=System.currentTimeMillis();
int帧=0;
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
勾选();
三角洲--;
}
如果(正在运行)
render();
frames++;
if(System.currentTimeMillis()-计时器>1000){
定时器+=1000;
系统输出打印项次(“FPS:+帧);
帧=0;
}
}
停止();
}
私人空白勾号(){
handler.tick();
}
私有void render(){
BufferStrategy bs=this.getBufferStrategy();
如果(bs==null){
这一战略(3);
回来
}
Graphics g=bs.getDrawGraphics();
g、 设置颜色(颜色为黑色);
g、 fillRect(0,0,宽度,高度);
handler.render(g);
g、 处置();
b.show();
}
公共静态void main(字符串[]args){
新游戏();
}
}
`


一些更新:

我在macOS High Sierra 10.13.1上使用了Oracle的JavaSE9JDK

我试图使用Eclipse,但问题有时会出现,但不是那么频繁

我还尝试使用OpenJDK1.7构建和运行源代码。问题仍然存在,但变得不太常见


我在Windows10上使用OpenJDK1.8进行了尝试,但该错误从未出现。

我自己找到了原因。这是macOS High Sierra和Java AWT包的错误! JavaAWT是一个不推荐使用的软件包,macOS不太支持它

因此,在画布渲染不好时正确显示帧的原因是代码使用JavaSwing包创建窗口(JFrame),而画布来自AWT

后来我尝试了awt的一些其他特性,例如java.awt.event.KeyEvent,但有时也会失败


因此,我认为最好的解决方案是停止在macOS上使用java awt包。

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参见:如何创建。使用链接改进您的问题-不要通过评论添加更多信息。谢谢@GhostCat使用评论中的
[edit]
快捷方式创建链接,而不是说“edit”。@AndyTurner整洁的一个,谢谢。马上更新我的自动文本@幽灵猫谢谢你的建议!这是我第一次问问题。
package com.tutorial.main;

import java.awt.*;
import java.awt.image.BufferStrategy;
import java.util.Random;

public class Game extends Canvas implements Runnable {

    private static final long serialVersionUID = 1569537827497786082L;

    public static final int WIDTH = 640, HEIGHT = WIDTH / 12 * 9;

    private Thread thread;
    private Boolean running = false;

    private Handler handler;

    private Random r;

    public Game() {
        handler = new Handler();

        new Window(WIDTH, HEIGHT, "Let's Build a Game!", this);

        r = new Random();
        for (int i = 0; i < 50; i++) {
            handler.addObject(new Player(r.nextInt(WIDTH), r.nextInt(HEIGHT), ID.Player));
        }
//        handler.addObject(new Player(200, 200, ID.Player));
    }

    public synchronized void start() {
        thread = new Thread(this);
        thread.start();
        running = true;
    }

    public synchronized void stop() {
        try {
            thread.join();
            running = false;
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;
        while(running){
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                tick();
                delta--;
            }
            if(running)
                render();
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("FPS: " + frames);
                frames = 0;
            }
        }
        stop();
    }

    private void tick() {
        handler.tick();

    }

    private void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            this.createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();

        g.setColor(Color.black);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        handler.render(g);

        g.dispose();
        bs.show();

    }

    public static void main(String[] args) {
        new Game();
    }
}