// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= NetBeans IDE 中的 JDK 7 支持概述
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: NetBeans IDE 中的 JDK 7 支持概述 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, NetBeans IDE 中的 JDK 7 支持概述

NetBeans IDE 支持 Java 7 语言功能，例如菱形运算符、switch 中的 String、multicatch 等。在代码中使用这些结构时，IDE 会识别它们，在代码完成中提供正确的类，正确突出显示错误并使您能够自动修复语法。因此，NetBeans IDE 可帮助您编写与 link:http://docs.oracle.com/javase/specs/jls/se7/html/index.html[+Java 语言规范 Java SE 7 Edition+] 兼容的代码。

在本教程中，您将了解 IDE 如何处理 Java 7 语言结构。


image::images/netbeans-stamp-80-74.png[title="此页上的内容适用于 NetBeans IDE 7.4 和 8.0"]


*要学完本教程，您需要具备下表所列的软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |版本 7.4 或 8.0 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包 (JDK)+] |版本 7 或 8 
|===


== 确保在 NetBeans IDE 中注册 JDK 7

要检查是否在 NetBeans IDE 中注册了 JDK 7，请执行以下操作：

1. 在 IDE 中，从主菜单中选择 "Tools"（工具）> "Java Platforms"（Java 平台）。
2. 确保在 "Java Platforms Manager"（Java 平台管理器）对话框的 "Platforms"（平台）列表中选定 "JDK 1.7"。

[.feature]
--
image::images/platform-small.png[role="left", link="images/platform.png"]
--



. 单击 "Close"（关闭）。


== 检查项目配置

要检查您的项目是否配置为使用注册的 JDK 进行编译、运行和调试，请执行以下操作：

1. 通过选择 "File"（文件）> "New Project"（新建项目），然后选择 "Java Application"（Java 应用程序）作为项目类型，来创建 Java 项目。
2. 单击 "Next"（下一步）。
3. 键入  ``SwitchTest``  作为项目名称并指定其位置。
4. 单击 "Finish"（完成）。
5. 在 "Projects"（项目）窗口中，右键单击  ``SwitchTest``  项目节点，然后选择 "Properties"（属性）> "Libraries"（库）。在此标签上，确保在 "Java Platforms"（Java 平台）列表中选定 "JDK 1.7"。

[.feature]
--
image::images/props-libs-small.png[role="left", link="images/props-libs.png"]
--



. 切换到 "Project Properties"（项目属性）窗口的 "Sources"（源）标签，并确保选择 "JDK 7" 作为源代码/二进制格式。

[.feature]
--
image::images/props-sources-small.png[role="left", link="images/props-sources.png"]
--



. 单击“确定”。关闭“项目属性”对话框。您的项目配置为识别 Java 7 语言功能。


== 使用新的 JDK 7 语言结构：Switch 语句

JDK 7 在不同领域提供了一些link:http://openjdk.java.net/projects/jdk7/features/[+新增功能和改进功能+]，其中包括国际化、I/O 和网络、安全等。要说明 IDE 的 Java 编辑器提供的 JDK 7 支持，最好的方法是演示 Project Coin 引入的一些语言变化。

其中一个变化是“switch 中的 String”。在早期版本的 Java 中， ``switch``  的参数只能属于以下基本数据类型： ``byte`` 、 ``short`` 、 ``char`` 、 ``int``  或  ``enum`` 。从 JDK 7 开始，您可以在  ``switch``  语句的表达式中使用  ``String``  类型的参数。

1. 打开  ``SwitchTest.java`` ，并添加以下代码。该小样例显示几种颜色的 RGB 代码。
对于 JDK 7， ``color``  变量可以为  ``String`` 。

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        switch (color.toLowerCase()) {
            case "black": colorRGB = "000000"; break;
            case "red": colorRGB = "ff0000"; break;
            case "green": colorRGB = "008000"; break;
            case "blue": colorRGB = "0000ff"; break;
            default: colorRGB = "Invalid color"; break;
        }
        System.out.println(colorRGB);
        }
    }

----

如果在编辑器中错误地设置了粘贴的代码格式，请按 Alt-Shift-F 组合键以重新设置格式。



. 在 "Projects"（项目）窗口中，右键单击该项目节点并选择 "Run File"（运行文件）。此时将会看到应用程序输出，这是红色的 RGB 代码。
如果目标平台和源格式为 JDK 7，您可以看到构建成功，并且应用程序正常工作。

image::images/output.png[]



. 让我们改用以前的 JDK 6，并测试如何使用 JDK 6 编译器编译应用程序。
在 "Projects"（项目）窗口中，右键单击该项目节点并选择 "Properties"（属性）。在 "Sources"（源）类别中，将源代码/二进制格式设置为  ``JDK 6`` ，然后单击 "OK"（确定）。
您可以立即看到 JDK6 解析器无法识别语法。编译将失败，因为变量类型不兼容。

[.feature]
--
image::images/error-small.png[role="left", link="images/error.png"]
--



. 现在，让我们使用  ``if-then-else``  语句而非  ``switch``  重新编写代码，如下所示：

[source,java]
----

package switchtest;

    public class SwitchTest {

    public static void main(String[] args) {

        String color = "red";
        String colorRGB;
        if (color.equals("black")) {
            colorRGB = "000000";
        } else if (color.equals("red")) {
            colorRGB = "ff0000";
        } else if (color.equals("green")) {
            colorRGB = "008000";
        } else if (color.equals("blue")) { 
            colorRGB = "0000ff";
        } else {
            colorRGB = "Invalid color";
        }
        System.out.println(colorRGB);
        }
    }

----
在将 JDK 7 作为源代码/二进制格式的情况下，IDE 将识别这种情况，并允许您将其转换为  ``switch`` ，如下图中所示。

[.feature]
--
image::images/convert-small.png[role="left", link="images/convert.png"]
--

单击该提示， ``if-then-else``  结构将自动转换为  ``switch`` ，这与我们以前使用的 switch 完全相同。


== JDK 7 支持：更多示例

要演示 IDE 的 Java 编辑器如何识别和自动修复代码，以便与 JDK 7 语言规范兼容，让我们使用一个虚拟代码片段，该代码片段本身没有什么意义，但它包含所有主要的语言改进功能。

在逐步完成该虚拟代码片段并应用编辑器提示后，您将看到以下功能的操作方法示例：

* 在 Java 编译器可以推断通用实例类型而无需明确指定该类型时，利用自动类型推断。使用所谓的_菱形运算符_来标记类型推断情况。
* 在可以使用一个  ``catch``  块处理几种类型的异常错误时，使用改进的异常错误处理或 _multi-catch_。 
* 使用自动资源管理功能引入的资源关闭语句的新语法。

1. 将同一  ``SwitchTest.java``  文件中的旧应用程序代码替换为以下代码：

[source,java]
----

package switchtest;


import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SwitchTest {

    public void test() throws IOException {
        List<String> list = new ArrayList<String>();
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashMap<String, Integer> map2 = new HashMap<String, Integer>();
        String a = "ehlo";

        try {
            Method m = Object.class.getMethod("toString");
            m.invoke(this);
        } catch(NoSuchMethodException e) {
            e.printStackTrace();
        } catch(InvocationTargetException e) {
            e.printStackTrace();
        } catch(IllegalAccessException e) {
            e.printStackTrace();
        }

        FileInputStream in = null;
        try {
            in = new FileInputStream("foo.txt");

            int k;
            while ((k = in.read()) != -1) {
                System.out.write(k);
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}
 
----


. 请注意，IDE 将显示一些说明如何优化代码以符合 JDK 7 规范的提示，如本教程中上面所述。只需单击每个提示并选择建议的操作即可。 


. 最后，接受了所有建议后，您就应该具有与 JDK 7 兼容的代码，如下所示。

[.feature]
--
image::images/converted-small.png[role="left", link="images/converted.png"]
--

link:/about/contact_form.html?to=3&subject=Feedback: Overview of JDK 7 Support in NetBeans IDE[+发送有关此教程的反馈意见+]



== 另请参见

有关 JDK 7 和 NetBeans IDE 的详细信息，请参见：

* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb7400&id=NBDAG465[+设置目标 JDK+]
* link:http://download.oracle.com/javase/tutorial/essential/io/fileio.html[+Java 教程：文件 I/O+] - Java 教程中的一个部分，其中包含 JDK 7 中的一些 I/O 变化示例。
* link:http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html[+Java 教程：分支和结合+] - 说明了 JDK7 中的新分支/结合框架。

有关在 NetBeans IDE 中开发 Java 应用程序的详细信息，请参见：

* link:javase-intro.html[+开发常规 Java 应用程序+]
* link:../../trails/java-se.html[+常规 Java 开发学习资源+]
* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG366[+创建 Java 项目+]
